Try*_*der 18 java methods unit-testing void mockito
我有以下情况:
class Worker {
public Integer somework() {
Integer k=0;
Helper h= new Helper();
h.change(k);
return k;
}
}
class Helper {
public void change(Integer k) {
//k = Some calcs
}
}
Run Code Online (Sandbox Code Playgroud)
我正在制作unitests Worker
,显然我想要模拟Helper
类,以便他的change
方法总是将1放入k
.
我的实际情况比较复杂,但这段代码代表了问题.感谢帮助.
omk*_*kar 18
我有一个定义如下的方法:
class Template{
public void process(Object rootMap, StringWriter out){
.......
}
}
Run Code Online (Sandbox Code Playgroud)
我将向您展示如何更改/修改"out"(StringWriter)引用.
private final Template mocktTemplate = mock(Template.class);
doAnswer(new Answer<StringWriter>() {
public StringWriter answer(InvocationOnMock invocation)
throws Throwable {
Object[] args = invocation.getArguments();
if (args[1] instanceof StringWriter) {
StringWriter stringWriter = (StringWriter) args[1];
stringWriter.write("Email message");
}
return null;
}
}).when(this.mocktTemplate).process(anyObject(),any(StringWriter.class));
Run Code Online (Sandbox Code Playgroud)
现在,当您确实进行实际调用时:
msgBodyTemplate.process(model, msgBodyWriter);
Run Code Online (Sandbox Code Playgroud)
msgBodyWriter中Stringbuffer ref的值为"Email message"; 不论它早期的价值.
我认为 doAnswer 是处理 void 方法的最佳方法,该方法操作给定的参数。
doAnswer(new Answer() {
public Object answer(InvocationOnMock invocation) {
Object[] args = invocation.getArguments();
Mock mock = invocation.getMock();
return null;
}})
.when(mock).someMethod();
Run Code Online (Sandbox Code Playgroud)
基本上,在获得参数后,您可以进行任何您想要的修改。有一篇博客文章对此进行了一些解释。
我会更改方法签名并使其Helper
以实例作为参数。调用者将创建帮助程序并将其传递给该somework
方法。该测试将通过模拟助手。
如果这是不可能的,至少调用受保护的工厂方法来创建帮助器,并在测试该方法时模拟此工厂方法,somework
以使其返回模拟帮助器:
class Worker {
public Integer somework(){
Integer k=0;
Helper h= createHelper();
h.change(k);
return k;
}
// this method may be mocked when testing somework, to return a mock helper.
protected Helper createHelper() {
return new Helper();
}
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
11972 次 |
最近记录: |