我正在尝试测试我的Utils类。一些方法使用其他类方法。我想模拟内部方法的使用,所以测试将假设它们工作(为了使它真正的单元测试,它测试特定的方法)。
我想测试' buildUrl'方法:
public static String buildUrl(String path, List<Pair> queryParams, DateFormat dateFormat) {
final StringBuilder url = new StringBuilder();
url.append(path);
if (queryParams != null && !queryParams.isEmpty()) {
// support (constant) query string in `path`, e.g. "/posts?draft=1"
String prefix = path.contains("?") ? "&" : "?";
for (Pair param : queryParams) {
if (param.getValue() != null) {
if (prefix != null) {
url.append(prefix);
prefix = null;
} else {
url.append("&");
}
String value = Utils.parameterToString(param.getValue(), dateFormat);
url.append(Utils.escapeString(param.getName())).append("=").append(Utils.escapeString(value));
}
}
}
return url.toString();
}
BuildUrl使用&#39; parameterToString&#39; (和其他人)我想模拟测试。所以我试过这样的事情:
@Test
public void testBuildUrl(){
Utils util = new Utils();
Utils utilSpy = Mockito.spy(util);
Mockito.when(utilSpy.parameterToString("value1",new RFC3339DateFormat())).thenReturn("value1");
List<Pair> queryParams = new ArrayList<Pair>();
queryParams.add(new Pair("key1","value1"));
String myUrl = utilSpy.buildUrl("this/is/my/path", queryParams, new RFC3339DateFormat());
assertEquals("this/is/my/path?key1=value1&key2=value2", myUrl);
}
但是我从Mockito那里得到MissingMethodInvocationException
。
所以我的问题实际上是 - 如何模拟在测试方法中调用的方法,以及我的测试有什么问题。感谢。
答案 0 :(得分:0)
您无法使用标准Mockito模拟/侦听静态调用。
您必须使用Powermockito以及以下内容:
@RunWith(PowerMockRunner.class)
@PrepareForTest(Utils.class)
public class MyClassTest{
@Test
public void testBuildUrl(){
PowerMockito.mockStatic(Utils.class);
// mock the static method to return certain values
Mockito.when(Utils.parameterToString("value1",new RFC3339DateFormat()))
.thenReturn("value1");
Mockito.when(Utils.escapeString(anyString()).thenReturn(desiredResult);
// rest of test code
}
以下是一些需要阅读的内容 - &gt; powermockito static
答案 1 :(得分:0)
我想模拟内部方法的使用,因此测试将假设它们有效(为了使其成为真正的单元测试,测试特定方法)。
单元测试不测试特定方法。
UnitTests测试正在测试的代码的公共可观察行为。
如果您觉得应该嘲笑某些方法,这可能表明您的设计需要改进。没有必要制作实用方法static
,也许你的被测班级要承担很多责任。
原因 PowerMock 将克服你的测试中的问题,但恕我直言,使用PowerMock是对糟糕设计的投降。