下面提到的是我需要测试的类:
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/