使用第三方API调用的构造函数的JUnits

时间:2017-08-03 11:12:37

标签: java junit4 powermock easymock

下面提到的是我需要测试的课程:

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?

1 个答案:

答案 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 构造函数做你期望它做的事情 - 这可能是因为静态调用失败而引发异常。

除此之外:我完全赞同这些评论 - 你的构造函数做了这么多(包括静态调用)的事实上有一定的设计气味。