Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/386.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java JMockit-要测试的类的实例为null_Java_Junit_Jmockit - Fatal编程技术网

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

Java JMockit-要测试的类的实例为null,java,junit,jmockit,Java,Junit,Jmockit,因此,我开始使用JMockit和JUnit来测试我的代码 我写了一个类,想测试这个类。课程安排如下- public final class KingdomDAOImpl implements KingdomDAO { private Map<KingdomType, Kingdom> kingdomEmblemMap; @Inject public KingdomDAOImpl(final Map<KingdomType, Kingdom> kingdomEmblem

因此,我开始使用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 final类KingdomDAOImpl实现KingdomDAO{
私人地图;
@注入
公共KingdomDAOImpl(最终地图Kingdommblemmap){
this.kingdomEmblemMap=kingdomEmblemMap;
}
@凌驾
公共地图{
返回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);
}
}
公共类KingdomDAOTest{
@注射的
私有静态地图;
@测试
私有静态kingdomdaimpl kingdomDAO;
@课前
类()之前的公共静态void{
kingdomEmblemMap=newhashmap();
}
@试验
public void getKingdomsTest(){
System.out.println(“=============+>”+kingdomDAO);
最终地图actualKingdomEmblemMap=kingdomDAO.getkingdals();
Assert.assertEquals(kingdomEmblemMap、actualKingdomEmblemMap);
}
}
现在,我遇到的问题是,
kingdomDAO
实例是
null
,我无法理解为什么。因此,
kindomDAO.getkindards()
抛出一个
NullPointerException

关于如何从这里开始有什么想法吗


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

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

版本1.42

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

版本1.45

模拟注释(@Mocked、@Capturing和@Injectable)不能 在JavaSE集合和映射接口上不再使用,例如 原因:1)在Java 8+上,此类接口包括默认方法,这 不要被嘲笑,在测试中容易导致意外结果;2) 嘲弄 所述接口(更一般地说,所有面向值的类型 基本上封装了状态,方法中没有复杂的行为) 这是一个众所周知的坏习惯。在有 @可注入的集合/映射字段,用于注入到 @测试对象,测试也应更改为使用@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);
    }
}
公共类KingdomDAOtest{
@测试
Map kingdomEmblemMap=newhashmap();
@测试
kingdomDAO impl kingdomDAO;
@试验
public void getKingdomsTest(){
System.out.println(“=============+>”+kingdomDAO);
最终地图actualKingdomEmblemMap=kingdomDAO.getkingdals();
Assert.assertEquals(kingdomEmblemMap、actualKingdomEmblemMap);
}
}

JMockit自上次使用以来有点变化。
我可以向您推荐的是,请务必阅读发行说明

版本1.42

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

版本1.45

模拟注释(@Mocked、@Capturing和@Injectable)不能 在JavaSE集合和映射接口上不再使用,例如 原因:1)在Java 8+上,此类接口包括默认方法,这 不要被嘲笑,在测试中容易导致意外结果;2) 嘲弄 所述接口(更一般地说,所有面向值的类型 基本上封装了状态,方法中没有复杂的行为) 这是一个众所周知的坏习惯。在有 @可注入的集合/映射字段,用于注入到 @测试对象,测试也应更改为使用@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);
    }
}
公共类KingdomDAOtest{
@测试
Map kingdomEmblemMap=newhashmap();
@测试
kingdomDAO impl kingdomDAO;
@试验
public void getKingdomsTest(){
System.out.println(“=============+>”+kingdomDAO);
最终地图actualKingdomEmblemMap=kingdomDAO.getkingdals();
Assert.assertEquals(kingdomEmblemMap、actualKingdomEmblemMap);
}
}

感谢您让我了解发行说明,我应该已经阅读了。另外,我应该在我的问题中提到,我使用的版本是
1.8
,我意识到它确实很旧。在将版本更新为
1.45
并使用您提供的代码片段之后,
kingdomDAO
仍然是
null
,在调用它的方法时给了我一个
NullPointerException
,有什么想法吗?@AkshanshJain使用1.45,您需要使用-javaagent:path-to-jmockit.jar启动JVM。在1.8版本中,您需要使用类注释RunWith(JMockit.class),非常抱歉回复太晚。是的,我能够使用类顶部的
@RunWith(JMockit.class)
来解决它。虽然,我正在从事的项目目前也使用JMockit 1.8,但是我们没有在测试类上提供这样的注释,这是我试图弄清楚的,但后来弄丢了。所以,问题解决了,解决方法是在我的案例中使用注释。谢谢你,伙计!谢谢你让我知道发行说明,我应该读一下。另外,我应该在我的问题中提到,我使用的版本是
1.8
,我意识到它确实很旧。在将版本更新为
1.45
并使用您提供的代码片段之后,
kingdomDAO
仍然是
null
,在调用它的方法时给了我一个
NullPointerException
,有什么想法吗?@AkshanshJain使用1.45,您需要使用-javaagent:path-to-jmockit.jar启动JVM。在1.8上,您需要