문제

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 매칭, 호출 카운트 등), 인스턴스 방법의 검증에만 국한되지 않습니다 (정적 메소드 및 생성자는 동일한 방식으로 조롱하고 검증 할 수 있습니다).

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top