Junit 测试:无法测试事务状态



我是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 {}
}

我的朱尼特班是这样的,

@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 和休眠4

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

2.@Mock
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(;

在你的朱尼特中使用这一切。它应该运行。

事情是:

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

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

工作:

  • 当您使用@RunWith(MockitoJUnitRunner.class(或
  • 使用另一个时,您正在调用MockitoAnnotations.initMocks(this)

( 见官方文档 (

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

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

最新更新