Junit测试:无法测试TransactionStatus

时间:2017-08-09 05:30:55

标签: spring junit mockito

是Junit Testing的新手。我有一个场景,

@Service
public class MainWorkerClass {

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

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

}

我的junit类失败,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,这是不被接受的。 我的替代解决方案或任何解决方案是否有任何解决方法来测试我的原始课程。

注意我无法改变我的罐子,使用spring4& hibernate4

2 个答案:

答案 0 :(得分:0)

1.使用PowerMockRunner而不是SpringRunner。  并在课程顶部使用@PrepareForTest({MainWorkerClass.class})

2 @莫克
HibernateTransactionManager txnManager。不要创建新对象。

3.使用 DefaultTransactionDefinition mockobj = PowerMockito.mock(DefaultTransactionDefinition.class); PowerMockito.whenNew(DefaultTransactionDefinition.class).withArguments(Mockito.any())thenReturn(mockobj)。 TransactionStatus mockstat = Mockito.mock(TransactionStatus.class);

4.将@InjectMocks放在顶部,然后将@Mock用于其他对象。

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

在junit中使用all。它应该运行。

答案 1 :(得分:0)

事情是:

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

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

工作:

  • 当您使用@RunWith(MockitoJUnitRunner.class)或
  • 使用其他人时,您正在调用MockitoAnnotations.initMocks(this)

(见官方documentation

换句话说:您的问题是您使用的是Spring运行器,它不会初始化模拟对象。

除此之外:正确使用@Mock注释意味着您需要为变量赋值。与此相反的。你要么模拟一个对象,要么给它分配一些东西! @InjectMocks也一样!