java - 用于使用第三方 API 调用的构造函数的 JUnit

标签 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吗?

最佳答案

简单:EasyMock 不支持模拟静态调用。因此,如果您不想更改您的代码,可以转向 PowerMock(ito) 或 JMockit。

但是更好的方法是了解使用静态总是会导致类之间的紧密耦合,并且您希望确保这不会影响您对代码进行单元测试的能力。

就您而言:

public MyClass(Connection con) {
  key = ThirdPartyApi.getkey(con);

只需将其替换为:

public MyClass(Connection con) {
  this (ThirdPartyApi.getkey(con));
}

/** unit testing only */
MyClass(Key key) {
  ...

瞧,您有了一个可以从单元测试中调用的构造函数 - 现在您只需传递一个模拟关键对象即可。并且您的测试将不再执行该静态调用 - 因为您在所有测试中都使用了取键构造函数。

但是您可能需要另一个测试用例来确保调用 public 构造函数执行您期望的操作 - 这可能会抛出异常,因为静态调用失败。

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

关于java - 用于使用第三方 API 调用的构造函数的 JUnit,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45482563/

相关文章:

java - 当实际值和期望值匹配时,AssertEquals 在什么情况下会失败?

java - 我们为什么要部署应用程序?

java - 等待两个 Futures/Runnables/Callables 中的任何一个完成?

Android JUnit4 测试

java - 模拟 JUnit 构造函数的最佳方法是什么?

java - 如何在java中模拟Session对象

java - 通过DER算法解码Java中的证书

java - CheckBoxTableCell 更改监听器不工作

java - PowerMock和EasyMock方法模拟问题

java - 使用 PowerMock 和 Mockito 通过 spy 与模拟协作者进行测试方法