Java 何时使用新操作符创建obj,何时使用自动连线注释测试类?

Java 何时使用新操作符创建obj,何时使用自动连线注释测试类?,java,spring,mockito,spring-test,Java,Spring,Mockito,Spring Test,我想测试的类叫做UserService,它使用sendmail方法向用户发送电子邮件 要完成此任务,它依赖于电子邮件服务。现在,当编写一个测试用例来测试这一点时,我应该创建UserService UserService=new UserService()和mock电子邮件服务,还是在我的测试类和mockEmailService中创建上下文文件defineUserServicebean和@Autowired UserService 这两种方法之间的区别是什么?我什么时候应该使用一种方法而不是另一种

我想测试的类叫做
UserService
,它使用
sendmail
方法向用户发送电子邮件

要完成此任务,它依赖于
电子邮件服务
。现在,当编写一个测试用例来测试这一点时,我应该创建
UserService UserService=new UserService()
和mock电子邮件服务,还是在我的测试类和mock
EmailService
中创建上下文文件define
UserService
bean和
@Autowired UserService


这两种方法之间的区别是什么?我什么时候应该使用一种方法而不是另一种?哪一个是真的

如果您的类是一个bean,例如您也希望注入依赖项,那么您应该使用new操作符创建实例。请查收

您可以创建一个
TestConfig.class
并模拟
UserService
的依赖项(使用您喜欢的模拟框架-我更喜欢)。在此TestConfig中,您将创建bean:

@Configuration
 public static class TestConfig {

   @Bean
   private EmailService emailService() {
       return Mockito.mock(EmailService.class);
   }

   //Assuming that you have constructor injection.
   @Bean
   public UserService userService() {
     return new UserService(emailService());
   }
}

关于使用@Autowired vs构造函数注入可能会有所帮助。将单元测试视为生产代码,并尽可能精简它们。在这种情况下,第二个选项使单元测试Spring意识到这一点,依我看,这会使单元测试变得比需要的更复杂。如果您想要一个简单的单元测试,那么构建您自己的实例并不依赖Spring来完成所有的连接是完全正确的。理想情况下,您应该同时进行这两项测试(一项是单元测试,另一项或多或少是集成测试)@M.Deinum,如果有可能Bean也被用作spring框架之外的POJO类。你能给我一个具体的例子吗,这是非常好的,请?另外,如果您创建了要测试的类的实例,而不让spring进行连接,那么它就不再是集成测试了?提前谢谢。我在哪里说这是集成测试?我甚至说那是一个单元测试而不是集成测试),我不想把它变成讨论,但我真的很想理解。(如果我错了,请纠正我)我想你暗示过,让spring进行依赖性连接将是一个集成测试的案例,正如你所写的“理想情况下,你应该同时进行这两项测试(一项是单元测试,另一项或多或少是集成测试)。”你也会很好,如果您回答了我的后续问题:为什么我们需要一次作为POJO和一次作为bean对类进行单元测试?你能提供什么真实的例子吗?如果你有一些复杂的业务逻辑,你首先要确保它是独立工作的(单元)。如果您不这样做,您的测试可能会被设置问题和错误的配置所困扰。更不用说单元测试通常比全面集成测试快得多。接下来,您需要一个集成测试(或者更确切地说是一个系统测试)。您发送一个请求,并在一次呼叫中从前面到后面测试所有内容。检查消息是否被发送、保存在数据库中等。