是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
答案 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();
仅工作:
MockitoAnnotations.initMocks(this)
(见官方documentation)
换句话说:您的问题是您使用的是Spring运行器,它不会初始化模拟对象。
除此之外:正确使用@Mock注释意味着您不需要为变量赋值。与此相反的。你要么模拟一个对象,要么给它分配一些东西! @InjectMocks也一样!