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

Java JUnits用于使用第三方API调用的构造函数,java,junit4,powermock,easymock,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 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);
 }
}
但这种情况会给我一个错误,即第三方API类在模拟连接对象时失败


所以我想模拟这个第三方的电话。是否可以使用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) {
  ...
瞧,您得到了一个可以从单元测试中调用的构造函数,现在您只需传递一个模拟键对象。您的测试将不再执行该静态调用,因为您在所有测试中都使用了密钥获取构造函数

但是您可能需要另一个测试用例来确保调用公共构造函数实现了您所期望的功能,这可能是因为静态调用失败而引发异常


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

Simple: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) {
  ...
瞧,您得到了一个可以从单元测试中调用的构造函数,现在您只需传递一个模拟键对象。您的测试将不再执行该静态调用,因为您在所有测试中都使用了密钥获取构造函数

但是您可能需要另一个测试用例来确保调用公共构造函数实现了您所期望的功能,这可能是因为静态调用失败而引发异常


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

为什么不把键作为参数传递呢?我想我的问题有点不清楚,我已经重新编辑过了。我说的是一样的:为什么不把键直接传递给构造函数???正如你所解释的,你要做的是测试你的
getKey()
函数?好吧,为了准确回答你的问题,你正在尝试存根一个静态方法。Easymock并不是开箱即用的,这就是为什么您需要使用PowerMock的原因——它与stubing任何其他静态方法完全相同,PowerMock文档对此进行了很好的解释。然而,你是否真的应该这样做是另一回事。构造函数应该是一段非常简单的代码,没有那么多逻辑。如果是我,我会考虑如何以不同的方式设计我的类。你为什么不把键作为参数传递呢?我觉得我的问题有点不清楚,我已经重新编辑了它。我说的是一样的:为什么不直接把键传递给构造函数???正如你所解释的,你要做的是测试你的
getKey()
函数?嗯,为了准确回答您的问题,您正在尝试存根一个静态方法。Easymock并不是开箱即用的,这就是为什么您需要使用PowerMock的原因——它与stubing任何其他静态方法完全相同,PowerMock文档对此进行了很好的解释。然而,你是否真的应该这样做是另一回事。构造函数应该是一段非常简单的代码,没有那么多逻辑。如果是我,我会考虑如何以不同的方式设计我的课程。