我是Junit测试的新手,但我必须测试一些代码。我想现在我知道它的基础知识,但我仍然遇到一个问题,我无法在互联网上找到任何东西:
这是我要测试的课程:
public static void methodToTest(Label l2, Label l3, User u) {
int first = MyDB.someMethod(u.anotherMethod()).size();
int second = MyDB.someOtherMethod(u).size();
if (first == 1) {
l2.setCaption("...");
}
...
}
我不希望系统创建整数'首先'和第二个'。相反,我只是希望他们成为' 1'所以我可以测试最后一行代码是否正常工作。
MyDB是一个带有静态方法的公共类(someMethod()和someOtherMethod())
我想测试Method methodToTest。我试图用parms调用这个方法,最后将修改后的params与预期的params进行比较。
我使用Mockito和PowerMockito。
这是我的尝试之一:
@PrepareForTest({ClassToTest.class, MyDB.class })
@RunWith(PowerMockRunner.class)
public class Test extends PowerMockTestCase{
PowerMockito.mockStatic(MyDB.class);
PowerMockito.doReturn(1).when(MyDB.someMethod(u.anotherMethod()).size());
PowerMockito.doReturn(1).when(MyDB.someOtherMethod(u).size());
ClassToTest.methodToTest(l1, l2, u);
assertTrue(l1.equals(l3) && l2.equals(l4));
}
我得到的例外是: '参数传递给when()不是模拟!'
我希望有人能帮助我。我花了这么多时间来解决这个问题,但没有成功。
谢谢!!!
答案 0 :(得分:1)
正如我在评论中提到的,你发现静态方法是测试的障碍。所以,我建议你避免使用静态方法。让我们看看你的例子中可能会是什么样子:
您需要测试一些代码..
public class ProductionClass {
public static void methodToTest(Label l2, Label l3, User u) {
int first = MyDB.someMethod(u.anotherMethod()).size();
int second = MyDB.someOtherMethod(u).size();
if (first == 1) {
l2.setCaption("...");
}
...
}
}
首先要做的事情是......将生产类的静态方法作为实例方法:
public class ProductionClass {
public void methodToTest(Label l2, Label l3, User u) { // removed "static"
int first = MyDB.someMethod(u.anotherMethod()).size();
int second = MyDB.someOtherMethod(u).size();
if (first == 1) {
l2.setCaption("...");
}
...
}
}
好的,所以你仍然可以在MyDB上使用静态方法。摆脱那种静态方法只会让你的生产类更加可测试。这是如何..你可以做这样的几个提取方法重构:
public class ProductionClass {
public void methodToTest(Label l2, Label l3, User u) {
int first = getFirst();
int second = getSecond();
if (first == 1) {
l2.setCaption("...");
}
...
}
int getFirst() {
return MyDB.someMethod(u.anotherMethod()).size();
}
int getSecond() {
return MyDB.someOtherMethod(u).size();
}
}
现在你可以轻松地对该生产类进行子类化并覆盖(或部分模拟,如果你愿意的话)你想要使用的方法..
public class TestableProductionClass extends ProductionClass {
@Override
int getFirst() {
return 1;
}
@Override
int getSecond() {
return 1;
}
}
不会让它变得比它需要的更难,并且引入PowerMock往往会增加我不愿意处理的复杂性。因人而异。祝你好运!