java - JMockit - 要测试的类的实例为空

标签 java junit jmockit

所以我开始使用 JMockit 和 JUnit 来测试我的代码。

我编写了一个类并想测试该类。类如下-

public final class KingdomDAOImpl implements KingdomDAO {

private Map<KingdomType, Kingdom> kingdomEmblemMap;

@Inject
public KingdomDAOImpl(final Map<KingdomType, Kingdom> kingdomEmblemMap) {
    this.kingdomEmblemMap = kingdomEmblemMap;
}

@Override
public Map<KingdomType, Kingdom> getKingdoms() {
    return kingdomEmblemMap;
}
}

我的测试类看起来像这样 -

public class KingdomDAOTest {

@Injectable
private static Map<KingdomType, Kingdom> kingdomEmblemMap;

@Tested
private static KingdomDAOImpl kingdomDAO;

@BeforeClass
public static void beforeClass() {
    kingdomEmblemMap = new HashMap<>();
}

@Test
public void getKingdomsTest() {
    System.out.println("=========+> " + kingdomDAO);
    final Map<KingdomType, Kingdom> actualKingdomEmblemMap = kingdomDAO.getKingdoms();

    Assert.assertEquals(kingdomEmblemMap, actualKingdomEmblemMap);
}
}

现在,我遇到的问题是 kingdomDAO 实例为 null,我无法理解为什么。因此,kinddomDAO.getKingdoms() 会抛出 NullPointerException

关于如何从这里继续进行有什么想法吗?

编辑:我使用的是 JMockit 版本 1.8。我尝试升级到 1.45 并用 @Tested 替换 @Injectable 注释,但仍然存在同样的问题。

最佳答案

自上次使用以来,JMockit 发生了一些变化。
我可以向您推荐的是,始终阅读发行说明!

版本1.42

JMockit now requires the use of the "-javaagent" JVM initialization parameter

版本1.45

Mocking annotations (@Mocked, @Capturing, and @Injectable) can no longer be used on Java SE collection and map interfaces, for two reasons: 1) on Java 8+, such interfaces include default methods, which do get mocked, easily causing unexpected results in tests; 2) mocking of said interfaces (and more generally, of all value-oriented types which basically encapsulate state without complex behavior in methods) is a well known bad practice. In the particular case of having an @Injectable collection/map field which is meant to be injected into a @Tested object, the test should be changed to use @Tested as well on the collection/map field, with its declaration positioned before the target @Tested field.

<小时/>

虽然我不会编写这样的测试,但工作示例是:

public class KingdomDAOtest {
    @Tested
    Map<KingdomType, Kingdom> kingdomEmblemMap = new HashMap<>();

    @Tested
    KingdomDAOImpl kingdomDAO;

    @Test
    public void getKingdomsTest() {
        System.out.println("=========+> " + kingdomDAO);
        final Map<KingdomType, Kingdom> actualKingdomEmblemMap = kingdomDAO.getKingdoms();

        Assert.assertEquals(kingdomEmblemMap, actualKingdomEmblemMap);
    }
}

关于java - JMockit - 要测试的类的实例为空,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54611133/

相关文章:

unit-testing - 如何在 Grails 中测试文件上传

java - 如何使用 Mockito 模拟 @Value 类?

java - 如何使用 JMockit 模拟 Spring 注入(inject)类

java - 我们如何使用mockito来获取对象

java - 如何解析这个日期

java - 在Java中获取泛型的泛型

java - 如何解决我的 Android 登录问题?

java - PowerMockito final方法调用验证不起作用

java - 如何使用 JMockit 模拟类中的最终实例变量

java - 如何将数据传递到字符串中,该字符串将在另一个类中访问?