使用Mockito进行模拟场注入

时间:2019-05-13 14:45:42

标签: java junit powermock powermockito

我是JUnit PowerMockito的新手。我尝试测试class。那个具有自动装配字段的类中的方法。 服务等级

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

调试屏幕

enter image description here

我该如何解决这个问题?

2 个答案:

答案 0 :(得分:1)

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

  • 首先,它们由@RunWith(PowerMockRunner.class)注入
  • 第二次,手动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

答案 1 :(得分:0)

已移动

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

testRegister方法。现在可以正常工作了。