Java 用Mockito模拟场注入

Java 用Mockito模拟场注入,java,junit,powermock,powermockito,Java,Junit,Powermock,Powermockito,我是JUnit PowerMockito的新手。我试图在一个类中测试一个方法。这个类有一个自动连接的字段。 服务等级 @Service public class MyServiceRegistration { @Autowired private AppConfig appConfig; public void register() throws xception { //Do some thing } } AppConfig @Comp

我是JUnit PowerMockito的新手。我试图在一个类中测试一个方法。这个类有一个自动连接的字段。 服务等级

@Service
public class MyServiceRegistration
{


    @Autowired
    private AppConfig appConfig;


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

@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字段为空

调试屏幕

如何解决此问题?

PowerMockito.when(AppConfig.getApplicationName()).thenReturn("SomeValue"); 

testRegister
方法。现在它可以工作了。

代码的问题是注入模拟两次

  • 首先,它们由
    @RunWith(PowerMockRunner.class)
  • 第二次,手动使用
    MockitoAnnotations.initMocks(this)
在第一个实例上设置期望值,然后覆盖模拟,这就是期望值不存在的原因

为了证明这一点

@之前
public void setUp()引发异常
{
当(appConfig.getApplicationName())。然后返回(“SomeValue”);
AppConfig beforeInitMocks=AppConfig;
initMocks(this);
AppConfig afterInitMocks=AppConfig;
System.out.println(“相同对象:”+(beforeInitMocks==afterInitMocks));
}

注意:我相信你的帖子中有输入错误,你应该有
PowerMockito.when(appConfig.getApplicationName())
(小写
appConfig

这是一个创可贴。我认为Lesiak的答案是真正的问题。