加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

java – 单元测试:在定义模拟行为后调用@PostConstruct

发布时间:2020-12-15 04:34:54 所属栏目:Java 来源:网络整理
导读:我有两节课: public MyService { @Autowired private MyDao myDao; private ListItems list; @PostConstruct private void init(){ list = myDao.getItems(); }} 现在我想在单元测试中涉及MyService,所以我会模仿MyDao的行为. XML: bean class = "com.pack
我有两节课:

public MyService     
{
    @Autowired
    private MyDao myDao;     

    private List<Items> list; 

    @PostConstruct
    private void init(){
         list = myDao.getItems(); 
    }
}

现在我想在单元测试中涉及MyService,所以我会模仿MyDao的行为.

XML:

<bean class = "com.package.MyService"> 
<bean  class="org.mockito.Mockito" factory-method="mock"> 
     <constructor-arg value="com.package.MyDao"/>
</bean>

<util:list id="responseItems" value-type="com.package.Item">
    <ref bean="item1"/>
    <ref bean="item2"/>
</util:list>

单元测试:

@ContextConfiguration("/test-context.xml")
@RunWith(SpringJUnit4ClassRunner.class)
public class MyServiceTest{

    @Autowired 
    MyService myService

    @Autowired 
    MyDao myDao;

    @Resource
    @Qualifier("responseItems")
    private List<Item> responseItems; 

    @Before
    public void setupTests() {
        reset(myDao); 
        when(myDao.getItems()).thenReturn(responseItems); 
    }

}

这样做的问题是创建了MyService bean,并且在定义模拟行为之前调用了它的@PostConstruct bean.

如何在XML中定义模拟行为,或者在单元测试设置之后延迟@PostConstruct?

解决方法

我的项目有同样的要求.我需要使用@PostConstructor设置一个字符串,我不想运行spring上下文,换句话说我想要简单的模拟.我的要求如下:

public class MyService {

@Autowired
private SomeBean bean;

private String status;

@PostConstruct
private void init() {
    status = someBean.getStatus();
}

}

解:

public class MyServiceTest(){

@InjectMocks
private MyService target;

@Mock
private SomeBean mockBean;

@Before
public void setUp() throws NoSuchMethodException,InvocationTargetException,IllegalAccessException {

    MockitoAnnotations.initMocks(this);

    when(mockBean.getStatus()).thenReturn("http://test");

    //call post-constructor
    Method postConstruct =  MyService.class.getDeclaredMethod("init",null); // methodName,parameters
    postConstruct.setAccessible(true);
    postConstruct.invoke(target);
  }

}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读