当我为 Junit 测试中的接口 @Autowired 时获取 null

Getting null when I @Autowired for the interface in Junit Test

我正在为此方法编写 JUnit 测试 processData - 我正在 Junit 中执行 @Autowired Cache mycache,并在我的测试方法下模拟 Cache mycache。当我这样做时 mycache = mock(Cache.class) - 这个 returns Junit 方法中的某个对象但是当我从 Junit 调用我的实际方法时 Cache mycacheMain [=38= 中变为 null ].请在下面找到代码:

我在这里遗漏了什么 - 如何解决这个 NullPointer 异常问题 - 为什么当从 Junit 触发实际方法时 mycache 变为 null - 虽然我已经模拟了这个对象。任何帮助将非常感激。谢谢!

Main.Java

import com.github.benmanes.caffeine.cache.Cache;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

@Component
public class Main {

    @Autowired
    Cache mycache;

    public Product processData(String productId) {

    System.out.println("productId value: " +productId);
    System.out.println("mycache value: " +mycache);

        Product product = (Product) mycache.getIfPresent(productId); //getting NullPointer exception here
        if (product != null) {
            return product;
        }
        // do some processing
        return product;
    }
}

MainTest.Java

public class MainTest {
    @Autowired
    Cache mycache;

    @Test
    public void processDataTest() throws Exception {
        Main main = new Main();
        mycache = mock(Cache.class);
        System.out.println("mycache: " + mycache.toString()); // Mock for Cache, hashCode: 3244883
        when(mycache.getIfPresent("9393939")).thenReturn(null);
        Product product = main.processData("9393939");
        assertNotNull(product);
    }
}

异常日志跟踪:

mycache: Mock for Cache, hashCode: 3244883
        productId value: 9393939
        mycache value: null

        java.lang.NullPointerException
        at com.test.processData(Main.java:122)
        at com.test.MainTest.processDataTest(MainTest.java:161)
        at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
        at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.base/java.lang.reflect.Method.invoke(Method.java:566)

如果你的测试用例中有 @Autowired 一个 class 你不应该模拟它。您需要使用 @Mock 注释 Cache 字段,否则您将无法模拟 Cache.class.

您在 processData 中得到 null 的原因是 Cache 对象是自动装配的而不是模拟的。

java.lang.NullPointerException
        at com.test.processData(Main.java:122)

你能试试下面的代码吗,

public class MainTest {

    @Mock
    Cache mycache;

    @Test
    public void processDataTest() throws Exception {
        Main main = new Main();
        // mycache = mock(Cache.class);
        System.out.println("mycache: " + mycache.toString()); // Mock for Cache, hashCode: 3244883
        when(mycache.getIfPresent("9393939")).thenReturn(null);
        Product product = main.processData("9393939");
        assertNotNull(product);
    }
}

而不是做:

@Component
public class Main {

   @Autowired
   Cache mycache;
   ...

通过构造函数注入:

  @Component
  public class Main {
      private final Cache mycache;

      public Main(Cache mycache) {
          this.mycache = mycache;
      }
  }

现在开始测试,您可以创建 Main 的实例,您可以在其中提供 Cache.

mock