개인적인 방법이 right-number-of-times/right-parameters라고 불리는 것을 테스트하기 위해 기대/검증을 사용할 수 있다면 조언 할 수 있습니까?Jmockit 공개 메소드 테스트시 개인 메소드 호출에 대한 기대/검증?
테스트 대상 클래스가 모의 업되었습니다. 하나의 개인 메소드가 오버라이드되었습니다.
Am 개인 메서드를 호출하는 공용 메서드를 테스트합니다.
공용 메서드가 실행될 때 호출 될 다른 개인 메서드에 대한 호출을 확인할 수 있는지 알고 싶습니다.
테스트중인 코드/클래스의 아이디어. 내 테스트 경우
public class UnderTest {
public void methodPublic(arg 1){
.....
methodPrivate1(var1);
....
methodPrivate2(var2);
}
private void methodPrivate1(var1){
//do stuff
}
private void methodPrivate2(var1){
//do stuff
}
}
은
@Test
public void stateBasedTestMethod()
{
UnderTest underTest;
new MockUp<UnderTest>() {
@Mock(invocations = 1)
private void methodPrivate2(var1) {
//do nothing in the mocked case
}
};
underTest = new UnderTest();
underTest.methodPublic(arg1);
new Verifications() {{
// Is there a way to test that methodPrivate1 has been called-once/with-expected-arguments
}};
}
ROGERIO의 대답에 대한 응답으로 수정 됨. jMockit 1.12 을 사용하고 있으며 제공된 솔루션을 사용하는 메소드가 JMockit 설명서에서 생각한 것처럼 메소드를 두 번 호출하므로 확인은 FAILING입니다.
오류 추적; mockit.internal.UnexpectedInvocation : 예상은 정확히 1 MyHelperTest $ 1 #의 Method3 ...의 호출 (들), 그러나이 포함
내가 이것을 사용하고있는 전체 코드는 2 회 호출되었습니다. 위에서 설명한 것처럼 내 목표는 개인적인 방법 중 하나를 조롱하여 아무 것도하지 않는 것입니다. 그리고 다른 개인 메서드가 한 번만 호출되는지 확인할 수 있는지 확인하십시오.
Jmockit으로 가능하면 미리 감사 드리며 더 나은 이해를 얻을 수 있습니다.
테스트 코드
public class MyHelperTest {
@Test
public void testHelper(@Mocked final MyDependent myDependent) {
final MyHelper myHelper;
new MockUp<MyHelper>() {
@Mock(invocations = 1)
private void method3(MyDependent myTable) {
System.out.println("In Mocked Method");
//do nothing in the mocked case
}
};
myHelper = new MyHelper();
myHelper.method1(myDependent);
new Verifications() {{
invoke(myHelper, "method2", myDependent); times = 1;
}};
}
}
테스트중인 클래스.
public class MyHelper {
public void method1(MyDependent myDependent){
method2(myDependent);
}
private void method2(MyDependent myDependent) {
myDependent.setValue(1);
method3(myDependent);
}
private void method3(MyDependent myDependent) {
myDependent.setValue(2);
}
}
종속 클래스
private
방법을 조롱하는 것은 권장하지 않습니다하지만 그것은, 가능
public class MyDependent {
private int value;
public int getValue() {
return value;
}
public void setValue(int value) {
this.value = value;
}
}
답장을 보내 주셔서 감사합니다. 제안 된 솔루션은 개인 메서드에서 호출이 발생했는지 확인하지 않습니다. "methodPrivate1"에 대한 또 다른 호출이 테스트를 통해 확인되었습니다. mockit.Deencapsulation.invoke (Object, String, Object ...) "지정된 클래스에서 지정된 인수로 액세스 할 수없는 (예 : private) 인스턴스 메서드를 호출합니다." 나는 확인하려고 노력하고있다. 공용 메서드를 테스트 할 때 개인 메서드에서 호출 (시간 및 args)을 확인할 수 있습니다. 개인 메서드 조롱에 대해서는 테스트 중에 DataBase에 씁니다. – DMac
예제 테스트는 JMockit 1.12에서 작동해야합니다. 이전 버전을 사용하는 경우 테스트가 너무 단순하지 않습니다 (동일한 필드에서 @Tested + @Mocked가 새로운 기능 임). 예기치 않은 개인 메소드에 대한 호출을 점검해야합니다. –
귀하의 의견에 따라 원래의 질문을 편집하십시오. 미리 감사드립니다. – DMac