2017-08-09 27 views
0

をテストするために失敗しましたJUnitのTesting..Iに新たに失敗JUnitのテスト:TransactionStatus

@Service 
public class MainWorkerClass { 

    @Autowired 
    @Qualifier("txnManager") 
    private HibernateTransactionManager txnManager; 

    public void task() { 
    ..... 
    TransactionStatus txnStatus = txnManager.getTransaction(new DefaultTransactionDefinition(TransactionDefinition.PROPAGATION_REQUIRES_NEW)); 
    ..... 
    } 

} 

私のJUnitのクラス、シナリオを持っているAM、getTransaction()ここlogger.isDebugEnabled()は、NPEをスローします。 だから私は以下のような代替をした、

public class JnuitTestTxnMgr implements PlatformTransactionManager{ 
    @Override 
    public void commit(TransactionStatus arg0) throws TransactionException {} 
    @Override 
    public TransactionStatus getTransaction(TransactionDefinition arg0) throws TransactionException { 
    return null; 
    } 
    @Override 
    public void rollback(TransactionStatus arg0) throws TransactionException {} 

} 

と私のJUnitのクラスは、同様

@RunWith(SpringJUnit4ClassRunner.class) 
@ContextConfiguration(loader = AnnotationConfigContextLoader.class, classes = {DBConfig.class}) 
public class MainWorkerClassTest { 
    @Mock 
    JnuitTestTxnMgr jnuitTransactionManagerOTP = new JnuitTestTxnMgr(); 
    @InjectMocks 
    MainWorkerClass worker = new MainWorkerClass(); 
    @Test 
    public void testTask() throws Exception{ 
    worker.task(); 
    } 

ですが、幸い、モックオブジェクトを注入されたが、タイプJnuitTestTxnMgrであり、テスト対象のクラスがされていないHibernateTransactionManagerを持っています受け入れられたもの。 私の元のクラスをテストするための代替ソリューションまたはその解決策の回避策はありますか?私は私のjarファイルを変更することはできません

注意、spring4 & hibernate4

+0

なぜあなたは簡単に模擬することができるように、あなたは実装がではなく、autowiredフィールドのタイプとしてインターフェイスを使いたいのですか? –

+0

ありがとう、ええ、インターフェイスをautowiringして、うまく動作します。しかし、このシナリオのための他の方法はありますか?私は今サービスクラスの変更をしたくないからです。 – RajeysGS

答えて

0

1.Use PowerMockRunner代わりのSpringRunnerを使用しています。 およびモック
HibernateTransactionManager txnManager @クラス

2の上部に@PrepareForTest({MainWorkerClass.classを})を使用します。新しいオブジェクトを作成しないでください。

3.Use DefaultTransactionDefinition mockobj = PowerMockito.mock(DefaultTransactionDefinition.class); PowerMockito.whenNew(DefaultTransactionDefinition.class).withArguments(Mockito.any())。then返される(mockobj); TransactionStatus mockstat = Mockito.mock(TransactionStatus.class);

4. @ InjectMocksを一番上に置き、他のオブジェクトの場合は@Mockを使用します。

5.Mockito.when(txnManager.getTransaction(mockobj))。thenReturn(mockstat);

あなたのjunit.Itでこのすべてを使用する必要があります実行してください。

+0

は、あなたが言ったものは何でもすべてをしようと、私は以前、 java.lang.NullPointerExceptionが言ったように、例外を取得した後:ヌル はorg.springframework.transaction.support.AbstractPlatformTransactionManager.getTransaction(AbstractPlatformTransactionManager.java:340)で – RajeysGS

+0

春は十分に複雑である\tそれだけで。その意味では、春の人々は自分のランナーを立てるべき理由があります。そのランナーは、Springとの単体テストを可能にするように設計されています。代わりにPowerMockを使用することをお勧めすると、まったく間違った方向に向かいます。 – GhostCat

0

事は次のとおりです。

@Mock 
JnuitTestTxnMgr jnuitTransactionManagerOTP; // = new JnuitTestTxnMgr(); 

@InjectMocks 
MainWorkerClass worker; // = new MainWorkerClass(); 

のみ作品:

  • 使用しているときに@RunWith(MockitoJUnitRunner.class)または
  • を使用していますあなたはもう一人呼んでいるMockitoAnnotations.initMocks(this)

つまり

(公式documentationを参照してください):あなたの問題は、モックオブジェクトを初期化しません春のランナーを、使用していることです。

それ以外:@Mockアノテーションを正しく使用することは、ではないことを意味します。は変数に値を割り当てる必要があります。それとは反対に。 オブジェクトをモックするか、何かを割り当てます。 @InjectMocksと同じです!