我需要使用mockito使用final方法模拟一些类.我写过这样的东西
@Test
public void test() {
B b = mock(B.class);
doReturn("bar called").when(b).bar();
assertEquals("must be \"overrided\"", "bar called", b.bar());
//bla-bla
}
class B {
public final String bar() {
return "fail";
}
}
Run Code Online (Sandbox Code Playgroud)
但它失败了.我尝试了一些"黑客",它的确有效.
@Test
public void hackTest() {
class NewB extends B {
public String barForTest() {
return bar();
}
}
NewB b = mock(NewB.class);
doReturn("bar called").when(b).barForTest();
assertEquals("must be \"overrided\"", "bar called", b.barForTest());
}
Run Code Online (Sandbox Code Playgroud)
它有效,但"闻起来".
那么,正确的方式在哪里?
谢谢.
我正在创建一个Java单元测试来测试我最近更改的一些代码.但是,我测试的方法实例化一个使用ResourceBundle的类...
ResourceBundle.getBundle("businessVariables").getString("product.name"));
Run Code Online (Sandbox Code Playgroud)
资源文件位于Web包中 Mycompany_web/src/main/webapp/WEB-INF/classes/businessVariables.properties
我的测试生活在我的xml包中 Mycompany_xml/src/test/java/uk/co/mycompany/xmlapi/RequestProcessorTestNew.java
在正常运行时,资源包可以访问,但不能在我的单元测试运行时访问.它抛出了这个错误......
Testcase: testCreateInitialStatusResponse(uk.co.mycompany.xmlapi.RequestProcessorTestNew): Caused an ERROR
null
java.lang.reflect.InvocationTargetException
at uk.co.mycompany.xmlapi.RequestProcessorTestNew.testCreateInitialStatusResponse(RequestProcessorTestNew.java:62)
Caused by: java.lang.ExceptionInInitializerError
at uk.co.mycompany.xmlapi.RequestProcessorImpl.createInitialStatusResponse(RequestProcessorImpl.java:812)
Caused by: java.util.MissingResourceException: Can't find bundle for base name businessVariables, locale en_US
Run Code Online (Sandbox Code Playgroud)
我该怎么办?我可以启用测试以某种方式查看资源包吗?我可以在某处以某种方式创建一个模拟资源文件,代码将能够看到吗?
我已经阅读了很多关于使用Powermock和Mockito的文章,并尝试了很多不同的方法,但我仍然无法弄清楚如何对下面的静态方法进行单元测试.
public static Map<String, String> getEntries() {
Map<String, String> myEntriesMap = new TreeMap<String, String>();
ResourceBundle myEntries = ResourceBundle.getBundle(ENTRIES_BUNDLE);
Enumeration<String> enumList = myEntries.getKeys();
String key = null;
String value = null;
while (enumList.hasMoreElements()) {
key = enumList.nextElement().toString();
value = myEntries.getString(key);
myEntriesMap.put(key, value);
}
return myEntriesMap;
}
Run Code Online (Sandbox Code Playgroud)
代码是包含大约30个这样的静态方法的(遗留)类的一部分,并且重构实际上不是一个选项.类似地,在一些其他静态方法中,正在检索DB连接.
例如:如何模拟资源包ENTRIES_BUNDLE并对此方法进行单元测试?我正在寻找一种可以普遍适用于所有静态方法的模式.