我正在尝试模拟一个包含2个静态成员A,B和静态方法Utils.SomeMethod的Impl。我最初尝试将PowerMock和Mockito混合使用,但是不确定这是否是导致问题的原因,所以我将所有引用都更改为PowerMockito。我收到模拟未得到调用的单元测试失败。如果我删除静电并仅使用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
}
}
答案 0 :(得分:0)
据我所知,您正在嘲笑java.sql
,但是如果要mainMethod调用静态方法,则应该实例化它。
另外,您是否要在代码中的某个地方初始化argumentsCaptor?
答案 1 :(得分:0)
我建议大多数测试模拟使用Mockito,仅在处理某些静态方法时才使用PowerMockito。稍作更改,您的测试代码就可以正常运行:
@RunWith(PowerMockRunner.class)
@PrepareForTest({ Utils.class })
public class ImplTest {
@Mock
A a;
@Mock
B b;
@Captor
ArgumentCaptor<String> argumentCaptor;
@BeforeClass
static public void setUp() {
PowerMockito.mockStatic(Utils.class);
Mockito.when(Utils.SomeMethod()).thenReturn("test"); // works
}
Impl impl;
@Before
public void before() {
Impl.setA(a);
Impl.setB(b);
impl = new Impl();
}
@Test
public void test() {
Mockito
.when(a.aMethod(Matchers.any(String.class)))
.thenReturn("hmmm");
Mockito
.when(b.bMethod(Matchers.any(String.class)))
.thenReturn("yo");
impl.mainMethod();
Mockito.verify(a, Mockito.times(1)).aMethod(argumentCaptor.capture());
Assert.assertEquals("foo", argumentCaptor.getValue());
Mockito.verify(b, Mockito.times(1)).bMethod(argumentCaptor.capture());
Assert.assertEquals("bar", argumentCaptor.getValue());
}
}
请注意,如果将A和B定义为静态,则应将它们注入到类中,而不应注入到单个实例中。
@InjectMocks
在这种情况下将不起作用,因为它需要一个不同的运行器。请看看另一篇Difference between @Mock and @InjectMocks