JMockit-要测试的类的实例为null

时间:2019-02-09 21:51:23

标签: 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,我不明白为什么。因此,kindomDAO.getKingdoms()引发了NullPointerException

关于如何从这里继续的任何想法?

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

1 个答案:

答案 0 :(得分:3)

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

1.42版

  

JMockit现在需要使用“ -javaagent” JVM初始化   参数

版本1.45

  

模拟注释(@ Mocked,@ Capturing和@Injectable)不能   不再用于Java SE集合和映射接口,两个   原因:1)在Java 8+上,此类接口包括默认方法,其中   确实受到嘲笑,容易在测试中导致意外结果; 2)嘲笑   所述接口(更一般地,所有面向价值的类型)   基本上封装了状态而没有复杂的方法行为)   是众所周知的坏习惯。在特定情况下   @Injectable collection / map字段,该字段应被注入到   @Tested对象,测试也应更改为使用@Tested   集合/地图字段,其声明位于   指定@Tested字段。


尽管我不会编写这样的测试,但有效的示例是:

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);
    }
}