gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 02:40:57 25 4
gpt4 key购买 nike

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

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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com