我有configuration类:
@ConfigurationProperties(prefix = "myConfig")
public class MyConfig {
protected String config;
}我的服务使用这个配置类(它从application.yml获取值):
@Service
public class myService {
@Inject
private MyConfig myConfig;
Public String getInfo (String param) {
if (isEmpty(param)) { throw new InvalidParameterException; }
return myConfig.getConfig();
}
}我正在尝试用Mockito来测试它:
@RunWith(MockitoJUnitRunner.class)
public class myTest {
@InjectMocks
private MyService myService;
@Mock
private MyConfig myConfig;
@Test
public void myTest1() {
myService.getInfo("a");
}
@Test
public void myTest2() {
assertThrows(InvalidParameterException.class, ()->myService.getInfo(null));
}
}myTest失败,因为config类被模拟,因此具有空值。用Mockito测试配置类的正确方法是什么?
编辑:我有许多像上面这样的配置类,它们正在myService中使用。
发布于 2019-08-01 16:10:40
你需要创建getter,然后它可以被Mockito模仿。
@ConfigurationProperties(prefix = "myConfig")
public class MyConfig {
protected String config;
public String getConfig() {
return config;
}
}。
@RunWith(MockitoJUnitRunner.class)
public class myTest {
@InjectMocks
private MyService myService;
@Mock
private MyConfig myConfig;
@Before
private void initializeConfig() {
when(myConfig.getConfig()).thenReturn("someValue");
}
@Test
public void myTest1() {
myService.getInfo("a");
}
}但是如果你不想在test中显式地设置这个值,你应该创建一个Spring集成测试,它将创建整个上下文并使用真实的对象。但这超出了这个问题的范围。
发布于 2019-08-01 17:53:27
您应该用@Configuration标记MyConfig,以便Spring在应用程序上下文中创建一个Spring bean。
您还需要使用@RunWith(SpringRunner.class)
SpringRunner支持加载一个SpringRunner,并将ApplicationContext @a连接到您的测试实例中。
另外,还可以用@Autowired更改@Inject,因为我不确定spring将如何支持@inject
服务类
@Service
public class myService {
@Autowired
private MyConfig myConfig;
Public String getInfo {
return myConfig.getConfig();
}
}测试类
@RunWith(SpringRunner.class)
public class myTest {
@Mock
private MyService myService;
@InjectMocks
private MyConfig myConfig;这是你应该在测试中获得真实对象的方法
编辑
考虑到您不想模仿myservice,那么我们应该用下面的代码替换您的测试类,并让我知道
@RunWith(SpringRunner.class)
public class myTest {
@autowired
private MyService myService;
@Test
public void myTest1() {
myService.getInfo("<NAME_OF_PROPERTIES>");
}
@Test
public void myTest2() {
assertThrows(InvalidParameterException.class, ()->myService.getInfo(null));
}https://stackoverflow.com/questions/57304149
复制相似问题