我是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字段为空。
调试屏幕
我该如何解决这个问题?
答案 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
方法。现在可以正常工作了。