使用Mockito测试@Postconstruct

时间:2018-09-25 16:25:39

标签: java spring mocking mockito postconstruct

为什么当我通过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 个答案:

答案 0 :(得分:1)

因为PostConstruct只是弹簧概念。但是您可以手动调用postConstruct。

@Before
public void prepare() {
    MockitoAnnotations.initMocks(this);
    this.service.init(); //your Injected bean
}

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

我通过添加方法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(SpringJUnit4ClassRunner.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