java - 使用 Mockito 模拟字段注入(inject)

标签 java junit powermock powermockito

我是 JUnit PowerMockito 的新手。我尝试测试类中的方法。该类具有 Autowiring 字段。 服务等级

@Service
public class MyServiceRegistration
{


    @Autowired
    private AppConfig appConfig;


    public void register() throws xception
    {
    //Do some thing
    }
}

应用程序配置

@Component
public class AppConfig
{
    @Value("${spring.application.name}")
    private String applicationName;

    @Value("${server.port}")
    private String serverPort;
    //getter and setter
}

测试类

@RunWith(PowerMockRunner.class)
@PrepareForTest({ AppConfig.class })
@PowerMockIgnore({ "javax.management.*" })
public class MyServiceRegistrationTest
{ 
    @InjectMocks
    MyServiceRegistration myServiceRegistration = new MyServiceRegistration();
    @Mock
    private AppConfig appConfig;

    @Before
    public void setUp() throws Exception
    {
        PowerMockito.when(AppConfig.getApplicationName()).thenReturn("SomeValue");
        MockitoAnnotations.initMocks(this);
    }

    public final void testRegister() throws Exception
    {

        myServiceRegistration.register();
    }
}

当我调试代码时,我可以看到 AppConfig 被模拟。但 applicationName 和 serverPort 字段为空。

调试屏幕

enter image description here

如何解决这个问题?

最佳答案

您的代码的问题是您注入(inject)了两次模拟。

  • 首先,它们由@RunWith(PowerMockRunner.class)注入(inject)
  • 第二次,手动使用 MockitoAnnotations.initMocks(this);

您在第一个实例上设置期望,然后覆盖模拟,这就是期望不存在的原因。

为了证明这一点

@Before
public void setUp() throws Exception
{
    PowerMockito.when(appConfig.getApplicationName()).thenReturn("SomeValue");
    AppConfig beforeInitMocks = appConfig;
    MockitoAnnotations.initMocks(this);
    AppConfig afterInitMocks = appConfig;
    System.out.println("Same object?: " + (beforeInitMocks == afterInitMocks));
}

注意:我认为您的帖子中有一个拼写错误,您应该有 PowerMockito.when(appConfig.getApplicationName()) (使用小写的 appConfig)

关于java - 使用 Mockito 模拟字段注入(inject),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56114761/

相关文章:

java - 我需要在图片的范围内创建一个可点击的图像。然后我需要图片在文件夹中的图片之间切换

mongodb - 在 Spring JUnit @WebMvcTest 中使用嵌入式 MongoDB

android - 如何在 ui 线程上注入(inject)并等待注入(inject)完成后再继续?

java - 模拟来自父类的方法以返回模拟数据

java - (java) 不兼容的类型?

java - 将不透明度从 0.0 0.1 .. 更改为 1.0 以创建动画效果

gradle compileJava 错误 : package org. junit 不存在

java - Powermockito 可以模拟非最终具体类中的 final方法吗?

java - 在公共(public)方法中拦截私有(private)方法返回的对象

Java Class.isAssignableFrom 总是返回 false ... 仅在 IDE 之外