代码之家  ›  专栏  ›  技术社区  ›  Jan Testowy

使用Mockito在施工后进行测试

  •  0
  • Jan Testowy  · 技术社区  · 6 年前

    为什么当我通过 Mockito 我的 @Postconstruckt 方法未调用?

    @Service
    public class MyService {
        public MyService() {
            System.out.println("CONSTRUKTOR");
        }
    
        @PostConstruct
        public void init() {
            System.out.println("POST CONSTRUCT");
        }
    
    @RunWith(MockitoJUnitRunner.class)
    public class Mockito1 {
    
        @InjectMocks
        private MyService service;
    
        @Before
        public void init() {
        }
    

    输出: 仅限于: CONSTRUKTOR

    3 回复  |  直到 6 年前
        1
  •  3
  •   Vadim Yemelyanov    6 年前

    因为后建设只是春天的概念。但是你可以手动调用postConstruct。

    @Before
    public void prepare() {
        MockitoAnnotations.initMocks(this);
        this.service.init(); //your Injected bean
    }
        2
  •  1
  •   Aleksandr Semyannikov    6 年前

    我通过添加一个方法foo对您的服务进行了一些修改:

    @Service
    public class MyService {
        public MyService() {
            System.out.println("CONSTRUKTOR");
        }
    
        @PostConstruct
        public void init() {
            System.out.println("POST CONSTRUCT");
        }
    
        public String foo() {
            return "bar";
        }
    }
    

    如果你想得到你所描述的行为,至少有两种可能:

    1. @RunWith(SpringJUnit4ClassRunner.class) + @Autowired -这个组合可以让你在考试中得到一个正常的服务

      @RunWith(SpringJUnit4ClassRunner.class)
      @ContextConfiguration(classes = MyService.class)
      public class Mockito1 {
      
          @Autowired
          private MyService service;
      
          @Before
          public void init() {
          }
      
          @Test
          public void name() throws Exception {
              System.out.println(service.foo());
          }
      }
      

    此代码将打印:

    CONSTRUKTOR
    POST CONSTRUCT
    bar
    
    1. @RunWith(春季4)ClassRunner.class类) + @SpyBean -这种组合将允许您在测试中获得服务并使用Mockito修改其行为

      @RunWith(SpringJUnit4ClassRunner.class)
      @ContextConfiguration(classes = MyService.class)
      public class Mockito1 {
      
          @SpyBean
          private MyService service;
      
          @Before
          public void init() {
          }
      
          @Test
          public void name() throws Exception {
              System.out.println(service.foo());
              Mockito.when(service.foo()).thenReturn("FOO");
              System.out.println(service.foo());
          }
      }
      

    此代码将打印:

    CONSTRUKTOR
    POST CONSTRUCT
    bar
    FOO
    
        3
  •  0
  •   Diego Marin Santos    6 年前

    @PostConstruct 是由JSR250定义的注释,它将在当前测试中被忽略,因为您正在使用 @RunWith(MockitoJUnitRunner.class) ,也就是说,一个JUnit运行程序不知道这个注释。如果您正在编写单元测试,它们应该很简单,只需测试应用程序的业务逻辑即可,但是如果您要编写集成测试,则使用能够处理此类注释的第三方代码,例如Spring。然后可以使用以下注释对测试类进行注释:

    @RunWith(SpringJUnit4ClassRunner.class)
    @ContextConfiguration(classes = {AppConfig.class})