2016-07-04 9 views
1

を定義した後@PostConstructを呼び出します。ユニットテスト:私は2つのクラス持って嘲笑行動

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を遅延させるにはどうすればよいですか?

答えて

1

MyDaoは外部システムの抽象であるように聞こえます。一般に、外部システムは@PostConstructメソッドで呼び出されるべきではありません。代わりに、別の方法でMyServiceにあなたのgetItems()を呼び出してください。

春の開始後にモキト注入が行われます。その時点で、モックはあなたの目のように機能しません。 @PostConstructを遅らせることはできません。これを打ち負かすと自動的に負荷が実行されるようにするにはMyServiceSmartLifecycleを実装し、getItems()start()に呼び出します。

+0

うん - 私は一般的に私の問題は私が解決しなければならないコードのにおいを示していることを、あなたはおそらく正しいと思います。 – dwjohnston

0

私のプロジェクトでは、同じ種類の要件があります。私は@PostConstructorを使って文字列を設定する必要があり、私は春のコンテキストを実行したくない、言い換えれば簡単な模擬が必要です。

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); 
    } 

} 
関連する問題