B не правильно написано на мой взгляд.Ссылка на A должна была быть введенной зависимостью.Теперь у вас есть 2 способа проверить это: чистый способ или способ PowerMock.Если вы сделаете чистый путь, то вы проведете рефакторинг B, чтобы в него была введена зависимость A, и поэтому вы можете управлять классом A с помощью макета.
class B {
A myAclass;
@Inject
public B(A myAclass) {
this.myAclass=myAclass;
}
public void testingThis() {
//..stuff
obj = myAclass.init()
moreStuff(obj)
}
}
Теперь тест может выглядеть примерно так:
@RunWith(MockitoJUnitRunner.class)
public class Btest {
@Mock
A myAmock;
@InjectMocks
B sut; // System-Under-Test
@Test
public void testB() {
X theObject = mock(X.class);
when(myAmock.init()).thenReturn(theObject);
// call the method
sut.testingThis();
//verify the call being done
verify(a, times(1)).init();
}
}
Если вы не можете изменить код B, вы все равно можете проверить его, но для этого вам нужен PowerMock (ito).
@RunWith(PowerMockRunner.class)
@PrepareForTests({A.class, B.class})
public class Btest {
B sut;
@Test
public void testB() {
A aMock = mock(A.class);
X thObject = mock(X.class);
// I can't determine from the code if the init method is static or you use an instance. In case of an instance you must override the constructor:
PowerMockito.mockStatic(A.class);
PowerMockito.whenNew(A.class).withNoArguments().thenReturn(aMock);
when(aMock.init()).thenReturn(theObject);
// In case of a static method you should mock that method
when(A.init()).thenReturn(theObject);
// Now construct B to test it.
sut = new B();
sut.testingThis();
// verify
verify(aMock, times(1)).init();
}
}