在我的服务方法中,我依赖于org.springframework.core.io.Resource
引用,并且我想使用以下代码为其中一种服务方法编写一个测试用例
以下代码如下:
@Service
public class EmailServiceImpl implements EmailService{
@Value("classpath:email_template.html")
private Resource emailTemplateResource;
private String getEmailTemplate() {
String template = null;
try {
template = new BufferedReader(new InputStreamReader(emailTemplateResource.getInputStream()))
.lines().collect(Collectors.joining("\n"));
} catch (IOException e) {
e.printStackTrace();
}
return template;
}
}
在这里,我无法在测试用例方法中模拟emailTemplateResource
对象。我尝试使用@Mock
和@Spy
,但是每次我在emailTemplateResource
对象上获取NullPointerException时。
那么,模拟此emailTemplateResource
对象的正确方法是什么?
答案 0 :(得分:2)
您可以在EmailServiceImpl
中进行构造函数注入。这样,在创建EmailServiceImpl
的模拟类中,您可以在构造函数中传递自己的Resource
对象。
这种方法的开销是@InjectMocks
没有用,因为现在您是在测试用例的before
钩子内部自己创建对象。
示例:
@RunWith(MockitoJUnitRunner.class)
public class EmailServiceImplTest{
EmailServiceImpl emailServiceImpl ;
Resource emailTemplateResource;
@Before
public void before() {
emailTemplateResource = //your impl here
emailServiceImpl = new EmailServiceImpl(resource);
}
}