如果没有在您正在测试的类中创建/初始化模拟对象,它是如何在运行时获取模拟对象的,它不是静态的(单例模式),或者您没有某种类型的测试构造函数可以挂钩?
在我正在编写单元测试的类中,我遇到了一个我尚未遇到/解决过的场景.我有一个JMS资源(QueueConnectionFactory供参考,但它没关系),这是我正在测试的类的私有变量.由于它具有javax.annotation.Resource注释,因此在运行时假定它是可用的.在测试期间,它不是,这就需要模拟这个对象.
它不是一个静态类,并没有以静态方式使用,如果它是我可以轻松地使用我遇到的各种静态模拟方法进行模拟.由于资源永远不会在本地创建(在构造函数中或甚至在测试构造函数中),因此我无法传入Mock对象,因此在测试的运行时,将使用mock而不是实际的对象.如何模拟此资源,以便在测试执行时,它将用于代替@Resource我正在测试的类中的私有对象?
作为参考,代码调用createConnection()在QueueConnectionFactory其中抛出一个空指针异常,因为该工厂尚未初始化/嘲笑.
@Stateless
public class Example{
@Resource(name = "jms/exampleQCF")
private QueueConnectionFactory queueFactory;
...
public void testMe(){
Connection connection = queueFactory.createConnection();
...
}
}
Run Code Online (Sandbox Code Playgroud) 我正在使用Mockito编写单元测试,我在模拟注入的类时遇到了问题.问题是两个注入的类是相同的类型,只能通过它们的@Qualifier注释区分.如果我试图简单地模拟SomeClass.class,那个模拟不会被注入,那个对象就null在我的测试中.我该如何模仿这些物体?
public class ProfileDAL {
@Inject
@Qualifier("qualifierA")
private SomeClass someClassA ;
@Inject
@Qualifier("qualifierB")
private SomeClass someClassB ;
//...various code, not important
}
@RunWith(MockitoJUnitRunner.class)
public class ProfileDALLOMImplTest {
@InjectMocks
private ProfileDALLOMImpl profileDALLOMImpl = new ProfileDALLOMImpl();
@Mock
private SomeClass someClassA;
@Mock
private SomeClass someClassB;
private SomeResult mockSomeResult = mock(SomeResult.class);
@Test
public void testSomeMethod() {
when(someClassA .getSomething(any(SomeArgment.class)).thenReturn(mockSomeResult);
Int result = profileDALLOMImpl.someTest(This isn't relevant);
}
}
Run Code Online (Sandbox Code Playgroud) dao.create()在测试方法时,我有一个想要模拟的调用.但我错过了一些东西,因为我还在接受NPE.这有什么不对?
class MyService {
@Inject
private Dao dao;
public void myMethod() {
//..
dao.create(object);
//
}
}
Run Code Online (Sandbox Code Playgroud)
如何模拟dao.create()调用?
@RunWith(PowerMockRunner.class)
@PrepareForTest(DAO.class)
public void MyServiceTest {
@Test
public void testMyMethod() {
PowerMockito.mock(DAO.class);
MyService service = new MyService();
service.myMethod(); //NPE for dao.create()
}
}
Run Code Online (Sandbox Code Playgroud)