如何模拟org.springframework.core.io.Resource对象?

时间:2019-11-06 07:11:22

标签: java spring spring-boot mockito

在我的服务方法中,我依赖于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对象的正确方法是什么?

1 个答案:

答案 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);
       }
}