В идеале, вы должны тестировать только интересующий вас уровень, но если вы хотите вызвать методы классов 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
PS вы можете использовать @Mock вместо spy, затем удалить новый оператор этого поля и смоделировать поведение этого метода класса.