Я пытаюсь смоделировать Impl, который содержит 2 статических члена A, B и статический метод Utils.SomeMethod. Сначала я пытался смешать PowerMock и Mockito, но не был уверен, что это вызывает проблему, поэтому я изменил все ссылки на PowerMockito. Я получаю сбои модульного теста, которые не вызывают mocks. если я уберу статику и просто использую Mockito, все тесты пройдут успешно.
Вот краткое описание проблемы.
class Impl {
static A a;
static B b;
private static final String s = Utils.SomeMethod();
void mainMethod() {
a.aMethod("foo");
b.bMethod("bar");
}
}
Итак, в моем модульном тесте у меня есть
@PowerMockIgnore({"javax.net.ssl.*" , "javax.crypto.*"})
@RunWith(PowerMockRunner.class)
@PrepareForTest({Utils.class})
public class ImplTest {
A a;
B b;
@Captor
ArgumentCaptor<String> argumentCaptor;
@BeforeClass
static public void setUp() {
PowerMockito.mockStatic(Utils.class);
PowerMockito.when(Utils.SomeMethod()).thenReturn("test"); // works
}
@Before
public void before() {
a = PowerMockito.mock(A.class);
b = PowerMockito.mock(B.class);
impl = PowerMockito.mock(Impl.class);
impl.setA(a); // I tried @Mock and @InjectMocks but seemed to not work on statics, works with non static members
impl.setB(b);
}
@Test
public void test() {
PowerMockito.when(a
.aMethod(any(String.class))
.thenReturn("hmm");
PowerMockito.when(b.bMethod(any(String.class))
.thenReturn("yo");
impl.mainMethod();
verify(a, times(1)).aMethod(argumentCaptor.capture());
// fails that 0 times mock was invoked
}
}