我在类中有一个方法会对方法的参数产生副作用:
public void SideEffectsClass {
public void doSomethingWithSideEffects(List<Object> list) {
// do something to the list
}
}
正在测试这个课程:
public void ClassUnderTest() {
public List<Object> execute() {
List<Object> results = new ArrayList<Object>();
new SideEffectsClass().doSomethingWithSideEffects(results);
return results;
}
}
我使用JMockit的测试方法:
@Test
public void test() throws Exception
{
// arrange
new Expectations()
{
SideEffectsClass sideEffects;
{
new SideEffectsClass();
sideEffects.doSomethingWithSideEffects((List<Object>) any);
// I want to simulate that the List<Object> parameter has changed
// (has more elements, less elements, etc. after this method is called
}
};
// act
ClassUnderTest testClass = new ClassUnderTest();
List<Object> results = testClass.execute();
// assert
Assert.assertEquals(myExpectedResults, results);
}
答案 0 :(得分:4)
您可以使用Delegate
对象更改参数值:
sideEffects.doSomethingWithSideEffects((List<Object>) any);
result = new Delegate() {
void delegate(List<Object> list) { list.add(new Object()); }
};
如果您只需要验证调用了doSomethingWithSideEffects
方法,那么测试可以更简单地编写为:
@Test
public void test(final SideEffectsClass sideEffects)
{
List<Object> results = new ClassUnderTest().execute();
assertEquals(myExpectedResults, results);
new Verifications() {{
sideEffects.doSomethingWithSideEffects((List<Object>) any);
}};
}
答案 1 :(得分:0)
正如测试试图告诉你的那样,副作用不是ClassUnderTest行为的一部分。不要试图在这里测试。根据您显示的代码,您应该测试的是results
传递给doSomethingWithSideEffects()
并且execute()
返回相同的对象。由于不熟悉JMockit语法,我无法准确地告诉你如何编写它。
除此之外:我建议每个使用jMock,JMockit或EasyMock等工具的人都应该使用Mockito,如果可以的话。