簡體   English   中英

Junit void方法測試

[英]Junit test of void method

我正在測試一種返回類型為 void 且帶有一個參數的方法。 我試圖至少獲得一些代碼覆蓋率。 這是我正在測試的一種方法:

@Service
public class VaultService {

    private final ProductRepository repository;

    private final DatabaseService databaseService;

    public VaultService(
            @Autowired BuildProperties buildProperties,
            ProductRepository repository,
            DatabaseService databaseService
    ) {
        logger.info("Creating service");

        this.repository = repository;
        this.databaseService = databaseService;
    }

    protected void checkVaultResponseErrors(VaultResponse vaultResponse) {
        if (vaultResponse.responseStatus != ResponseStatus.SUCCESS) {
            vaultResponse.errors.forEach(error -> {
                if (vaultResponse.responseStatus.equals(ResponseStatus.EXCEPTION)) {
                    throw new VaultException(error.getMessage());
                }
                if (vaultResponse.responseStatus.equals(ResponseStatus.FAILURE)) {
                    throw new VaultFailure(error.getMessage());
                }
            });
        }
    }

VaultResponse class 看起來像這樣

@Getter
@Setter
@JsonInclude(JsonInclude.Include.NON_NULL)
public class VaultResponse {
    @JsonProperty("responseStatus")
    public ResponseStatus responseStatus;

    @JsonProperty("errors")
    public List<Error> errors;
}

這是我的測試。 我收到Mockito.verify錯誤,但代碼的 rest 也沒有得到任何覆蓋。 我顯然做錯了什么。

@Test
void should_check_vaultResponse_for_errors() {
    VaultService spyService = Mockito.spy(vaultService);
    VaultResponse vaultResponse = new VaultResponse();
    ResponseStatus status = ResponseStatus.SUCCESS;
    List<Error> error = new ArrayList<>();

    vaultResponse.setResponseStatus(status);
    vaultResponse.setErrors(error);

    doThrow(IllegalArgumentException.class)
            .when(spyService).checkVaultResponseErrors(vaultResponse);
    doNothing().when(spyService).checkVaultResponseErrors(vaultResponse);

    verify(spyService, times(1)).checkVaultResponseErrors(vaultResponse);
}

您的測試方法清楚地表明您要測試checkVaultResponseErrors方法。 這意味着你絕對應該嘲笑它。 您可以模擬使其工作所需的任何東西,但不能模擬方法本身。

在我看來,要編寫三個測試:

  1. 沒有錯誤:
// create VaultResponse without errors; you have that now

assertDoesNotThrow(() -> vaultService.checkVaultResponseErrors(vaultResponse));
  1. 有一個例外:
// create VaultResponse with status EXCEPTION

VaultException thrown = assertThrows(VaultException.class,
        () -> vaultService.checkVaultResponseErrors(vaultResponse));
// you can now assert that thrown is what you expect
  1. 失敗了:
// create VaultResponse with status FAILURE

VaultFailure thrown = assertThrows(VaultFailure.class,
        () -> vaultService.checkVaultResponseErrors(vaultResponse));
// you can now assert that thrown is what you expect

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM