所以我已经开始使用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
,但仍然存在相同的问题。
答案 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);
}
}