为什么当我通过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
答案 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";
}
}
如果您要描述的话,至少有两种可能性:
@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
@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