我正在为一个有两个方法methodA,methodB的类编写JUnit Test案例。 我想在我的测试用例中模拟从methodA调用methodB 我在我正在测试的类上使用间谍,但仍然执行了methodB。
这是班级
public class SomeClass
{
public Object methodA(Object object)
{
object=methodB(object);
return object;
}
public Object methodB(Object object)
{
//do somthing
return object;
}
}
这是测试类
@RunWith( org.powermock.modules.junit4.legacy.PowerMockRunner.class )
@PrepareForTest(SomeClass.class)
public class SomeClassTest {
private SomeClass var = null;
@Before
public void setUp() {
var=new SomeClass();
}
@After
public void tearDown()
{
var= null;
}
@Test
public void testMethodA_1()
throws Exception {
Object object =new Object();
SomeClass spy_var=PowerMockito.spy(var);
PowerMockito.when(spy_var.methodB(object)).thenReturn(object);
Object result = var.methodA(object);
assertNotNull(result);
}
}
虽然我已经嘲笑它,但方法B仍然会被调用 PLease建议我使用正确的方法来模拟同一类的methodA中的methodB调用。
答案 0 :(得分:5)
采用这种方法会导致脆弱的测试,如果你重构你的测试类,需要改变。我强烈建议您尝试通过检查SomeClass
的状态来确定您的预期测试结果,而不是依赖于模拟。
如果确实需要模拟MethodB
,那么这表明MethodB
中的行为可能实际属于一个单独的类,然后您可以测试SomeClass
与MethodA
的交互通过嘲笑
如果你确实需要按照你的要求去做,那么PartialMock就是你想要的。
您可能想要创建某个类的部分模拟,但表示对MethodB
的调用应调用实际方法,然后模拟{{1}}
正如他们的文档中所述虽然Partial mocks是代码味道,但他们已经确定了一些明确的用例。
答案 1 :(得分:4)
我昨天碰到了这个,因为间谍最好做回复(X)。当(间谍).method(any())