mockito를 사용하여 방법 이후에 호출되지 않았는지 확인하십시오.
-
21-08-2019 - |
문제
Mockito를 사용하여 Java에서 단위 테스트를 작성하고 있으며 특정 방법이 마지막 물체를 불렀다.
테스트중인 코드에서 이와 같은 일을하고 있습니다.
row.setSomething(value);
row.setSomethingElse(anotherValue);
row.editABunchMoreStuff();
row.saveToDatabase();
내 모의에서 나는 행에 모든 것을 편집하는 순서에 신경 쓰지 않지만, 나는 매우 중요합니다. ~ 아니다 내가 그것을 저장 한 후에 더 많은 일을 시도하십시오. 이것을하는 좋은 방법이 있습니까?
나는 verifynomoreintercations를 찾고 있지 않다는 점에 유의하십시오. Savetodatabase가 마지막으로 불리는 것을 확인하지 않으며, 명시 적으로 확인하지 않는 행에서 호출하는 경우에도 실패합니다. 다음과 같은 말을 할 수 있기를 원합니다.
verify(row).setSomething(value);
verify(row).setSomethingElse(anotherValue);
verifyTheLastThingCalledOn(row).saveToDatabase();
도움이되면이 작업을 수행 한 Jmock 테스트에서 Mockito로 전환하고 있습니다.
row.expects(once()).method("saveToDatabase").id("save");
row.expects(never()).method(ANYTHING).after("save");
해결책
더 많은 맞춤 작업이 필요하다고 생각합니다.
verify(row, new LastCall()).saveToDatabase();
그리고
public class LastCall implements VerificationMode {
public void verify(VerificationData data) {
List<Invocation> invocations = data.getAllInvocations();
InvocationMatcher matcher = data.getWanted();
Invocation invocation = invocations.get(invocations.size() - 1);
if (!matcher.matches(invocation)) throw new MockitoException("...");
}
}
이전 답변 :
당신이 맞습니다. verifynomoreintercations는 필요한 것입니다.
verify(row).setSomething(value);
verify(row).setSomethingElse(anotherValue);
verify(row).editABunchMoreStuff();
verify(row).saveToDatabase();
verifyNoMoreInteractions(row);
다른 팁
주제에 대해 100%가 아니라 검증의 반대를 찾고 있었는데, 이것이 유일한 관련 결과였으며, Mockito.Verifyzerointercations (mock) 이후에 끝났습니다.
다른 사람이 여기서 끝나는 경우가 있습니다 ...
이 질문으로 인해 나는 검증 API jmockit (다가오는 릴리스 0.983에서 사용할 수 있음).
내가 생각한 솔루션을 사용하면 (테스트 방법으로) 글을 쓸 수 있습니다.
new VerificationsInOrder() {{
unverifiedInvocations();
row.saveToDababase();
}};
... 특정 방법이 다른 모든 것을 호출한지 확인하려면. 이를 확인하려면 발생합니다 ~ 전에 다른 모든 호출은 단순히 호출을 상단으로 이동합니다. 이것은 실제로 일련의 연속 호출 시퀀스에 적용됩니다.
위의 확인 외에도 다른 방법으로 호출되는지 확인하고자합니다. 검증 블록은 테스트에 추가 할 수 있습니다 (다른 블록 전후에는 중요하지 않음).
new Verifications() {{
row.setSomething(value);
row.setSomethingElse(anotherValue);
}};
익명의 내부 클래스를 사용하여 조금 길지만이 구문은 단순하고 유연합니다. 그것이 테스트에 구조를 추가하고 메소드 호출의 반복을 피하는 방법에 주목하십시오. verify(...)
). 내가 여기서 설명한 것보다 더 많은 것이 있으며 (Hamcrest 매칭, 호출 카운트 등), 인스턴스 방법의 검증에만 국한되지 않습니다 (정적 메소드 및 생성자는 동일한 방식으로 조롱하고 검증 할 수 있습니다).