所以我开始使用 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/