我需要为以下方法编写Junit测试用例的解决方案。
所有类都在不同的文件中,我想为类method2
的{{1}}编写测试用例。
在这种情况下如何使用A
?
@mock
答案 0 :(得分:2)
理想情况下,您应该只测试您所关注的层,但是如果要在单个测试用例中调用类A,B和C方法,则可以采用以下解决方案。此解决方案更像集成测试用例。
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.InjectMocks;
import org.mockito.Spy;
import org.mockito.runners.MockitoJUnitRunner;
@RunWith(MockitoJUnitRunner.class)
public class TestA {
@Spy
@InjectMocks
private B b = new B();
@Spy
private C c = new C();
@InjectMocks
private A a = new A();
@Test
public void testMethod1() {
String val = a.method1("test");
System.out.println(val);
}
}
class A {
public B b;
public String method2(String a){
System.out.println("Inside method A.method2");
return b.method3(a);
}
public String method1(String a){
System.out.println("Inside method A.method1");
return method2(a);
}
}
class B {
public C c;
public String method3(String a){
System.out.println("Inside method B.method3");
return c.method4(a);
}
}
class C {
public String method4(String a){
System.out.println("Inside method C.method4");
return a;
}
}
输出将如下所示
Inside method A.method1
Inside method A.method2
Inside method B.method3
Inside method C.method4
test
P.S,您可以使用@Mock而不是spy,然后删除该字段的新运算符,并模拟该类方法的行为。
答案 1 :(得分:1)
有一些工作要做。首先,必须使用某些IoC系统注入依赖类,例如使用@Autowired
或@Inject
:
class A{
@Autowired
private B b;
String method1(string a) {
//some changes applied on a
return b.method3(a);
}
String method2(String a){
return method1(a);
}
}
然后,您必须模拟以下测试:
@RunWith(MockitoJUnitRunner.class)
public class TestA {
@Mock
private B b;
@InjectMocks
private A a;
public void testMethod1() {
/* test code here */
}
}
还认为B
应该是接口,而不是具体的类。