Ris*_*abh 7 java junit unit-testing mockito
我正在为一个有两个方法methodA,methodB的类编写JUnit Test案例.我想在我的测试用例中模拟从methodA调用methodB我在我正在测试的类上使用spy,但仍然执行了methodB.
这是班级
public class SomeClass
{
public Object methodA(Object object)
{
object=methodB(object);
return object;
}
public Object methodB(Object object)
{
//do somthing
return object;
}
}
Run Code Online (Sandbox Code Playgroud)
这是测试类
@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);
}
}
Run Code Online (Sandbox Code Playgroud)
虽然我已经模拟了它,但方法B仍然可以调用它.但是PLease建议我使用适当的方法来模拟同一类的methodA中的methodB调用.
根据@Totoro 的回答,这只是一个总结。
@Spy。所以这:
@Spy
@InjectMocks
MyClassUnderTest myClassUnderTest;
Run Code Online (Sandbox Code Playgroud)
而不是仅仅
@InjectMocks
MyClassUnderTest myClassUnderTest;
Run Code Online (Sandbox Code Playgroud)
doReturn()而不是。when.thenReturn()doReturn(X).when(myClassUnderTest).method(any())
采用这种方法将导致脆弱的测试,如果你重构你的测试类,将需要改变.我强烈建议您尝试通过检查状态来确定您的预期测试结果,SomeClass而不是依赖于模拟.
如果你确实需要模拟MethodB然后这表明可能MethodB实际上属于一个单独的类中的行为,然后你可以测试SomeClass与通过模拟的交互
如果你确实需要按照你的要求去做,那么PartialMock就是你想要的.
你可能想创建一个类的部分模拟,但是表明调用MethodA应该调用实际的方法然后模拟MethodB
您可以在Mockito文档中查看如何使用它们
正如他们的文档中所述虽然部分模拟是一种代码气味,但他们已经确定了一些明确的用例.
| 归档时间: |
|
| 查看次数: |
19939 次 |
| 最近记录: |