下面提到的是我需要测试的课程:
public class MyClass {
private String key;
public MyClass(Connection con) {
key = ThirdPartyApi.getkey(con);
}
public String getKey() {
return key;
}
}
现在我需要测试这个构造函数,但是我无法模拟这个第三方API调用。测试案例如下所述:
public class MyClassTest{
@Test
public void test1(){
MyClass c = new MyClass(dummyconnection);
assertNotNull(c.getKey != null);
}
}
但是这种情况会给我一个错误,即由于模拟了连接对象,ThirdPartyAPI类失败了。
所以我想模仿这个ThirdPartyApi调用。是否有可能使用Easymock,powermock?
答案 0 :(得分:2)
简单:EasyMock不支持模拟静态调用。因此,如果您不想更改 代码,可以使用PowerMock(ito)或JMockit。
但更好的方法是理解使用 static 总是会导致类之间的紧密耦合,并且您希望确保这不会影响您对代码进行单元测试的能力。
在你的情况下:
public MyClass(Connection con) {
key = ThirdPartyApi.getkey(con);
只需将其替换为:
public MyClass(Connection con) {
this (ThirdPartyApi.getkey(con));
}
/** unit testing only */
MyClass(Key key) {
...
瞧,你有一个可以通过单元测试调用的构造函数 - 现在你只需传递一个模拟的密钥对象。并且您的测试将不再执行该静态调用 - 因为您在所有测试中都使用了获取键的构造函数。
但是你可能想要另一个测试用例来确保调用 public 构造函数做你期望它做的事情 - 这可能是因为静态调用失败而引发异常。
除此之外:我完全赞同这些评论 - 你的构造函数做了这么多(包括静态调用)的事实上有一定的设计气味。