Java 试图模拟服务,但我得到了NullPointerException(JUNIT/MOCKITO)

Java 试图模拟服务,但我得到了NullPointerException(JUNIT/MOCKITO),java,junit,mockito,junit4,Java,Junit,Mockito,Junit4,我是Junit和Mockito单元测试的新手。我需要对“processFiles(最终文件夹)”方法进行单元测试 由于我在这个方法中调用了另一个名为myService.isFileOk(data)的服务,我想我需要模拟这个服务以使它返回true 但是当我运行测试时,我得到一个空指针异常 这是processFiles方法代码的一部分: @EJB private transient MyService myService; public void processFiles(final

我是Junit和Mockito单元测试的新手。我需要对“processFiles(最终文件夹)”方法进行单元测试

由于我在这个方法中调用了另一个名为myService.isFileOk(data)的服务,我想我需要模拟这个服务以使它返回true

但是当我运行测试时,我得到一个空指针异常

这是processFiles方法代码的一部分:

  @EJB
  private transient MyService myService;

  public void processFiles(final File folder)
  {
     
      File[] fileNames = folder.listFiles();
      List<String> lines = new ArrayList<>();
      boolean isFirstFile = true;
      try
      {
          for (File file : fileNames)
          {
                  List<String> l = readContent(file, isFirstFile);
                  l.forEach(i -> lines.add(i));
                  isFirstFile = false;     
          }

          String[] data = lines.get(0).trim().split(";");
          if (!this.myservice.isFileOk(data))
          {
            // ...
          }
          else
          {
              // ...
          }
      }
      catch (IOException e)
      {
          e.printStackTrace();
      }
  }


你知道我应该如何继续模拟isFileOk吗?非常感谢您的帮助

您需要做的是将mock传递给持有实例的类,并使用matchers:

您还定义了两次MyService。在方法内部一次全局,一次局部。也许你应该考虑删除其中的一个。

您可以使用反射来设置
private-transient-MyService-MyService
MyClass

Field myServiceField = myclass.getClass().getDeclaredField("myService");
myServiceField.setAccessible(true);
f1.set(myClass, mock);
然后调用:

myclass.processFiles(file);

现在,您的模拟应该被初始化。

您需要做的是将模拟传递给包含实例的类,并使用匹配器:

您还定义了两次MyService。在方法内部一次全局,一次局部。也许你应该考虑删除其中的一个。

您可以使用反射来设置
private-transient-MyService-MyService
MyClass

Field myServiceField = myclass.getClass().getDeclaredField("myService");
myServiceField.setAccessible(true);
f1.set(myClass, mock);
然后调用:

myclass.processFiles(file);

现在应该初始化您的模拟。

您遇到的问题是,您正在尝试模拟@EJB,它将在实际运行时由容器服务注入

但是,在测试中,您没有使用容器服务,因此该服务不会被注入,并且在类的实例中保持为null

本质上,您正在寻找Spring的“@RunWith(SpringRunner.class)”注释的EJB等价物,该注释对您的测试用例执行执行注入


据我所知,EJB没有这个功能,但我已经有一段时间没有使用它了,所以我可能是错的。如果它确实没有,下一步你可以做的就是使用反射来强制它。

你遇到的问题是你试图模拟@EJB,它将在实际运行时由你的容器服务注入

但是,在测试中,您没有使用容器服务,因此该服务不会被注入,并且在类的实例中保持为null

本质上,您正在寻找Spring的“@RunWith(SpringRunner.class)”注释的EJB等价物,该注释对您的测试用例执行执行注入


据我所知,EJB没有这个功能,但我已经有一段时间没有使用它了,所以我可能是错的。如果它确实没有,下一步你可以做的就是使用反射强制它进入。

持有@EJB private transient MyService MyService的类的名称是什么;如何初始化myclass实例?我猜是myclass持有myService,如果您要模拟它,也可以删除“this.myService=new myService();”。是的,是myclass持有@EJB private transient myService myService;我这样初始化:@Mock ListFilesService ListFilesService;持有@EJB private transient MyService MyService的类的名称是什么;如何初始化myclass实例?我猜是myclass持有myService,如果您要模拟它,也可以删除“this.myService=new myService();”。是的,是myclass持有@EJB private transient myService myService;我这样初始化:@Mock ListFilesService ListFilesService;