Wal*_*lls 19 java mocking mockito powermock
如果没有在您正在测试的类中创建/初始化模拟对象,它是如何在运行时获取模拟对象的,它不是静态的(单例模式),或者您没有某种类型的测试构造函数可以挂钩?
在我正在编写单元测试的类中,我遇到了一个我尚未遇到/解决过的场景.我有一个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)
Wal*_*lls 39
经过更多的狩猎并查看Mockito/Powermock提供的所有选项之后,我找到了解决方案(如果其他人遇到同样的问题我会分享).
当您拥有从未初始化的私有成员变量(并且假设在其他地方创建)时,您可以使用@InjectMocks注释将您想要的模拟"注入"到您正在测试的类中.
@InjectMocks(org.Mockito.InjectMocks).@Mock注释设置要注入的模拟.使用@Mock (name = "privateVariableNameHere")name属性将Mock对象映射到您正在测试的类中的私有变量.@Before注释的"setup"方法.然后在里面调用MockitoAnnotations.initMocks(this);快速初始化@Mock注释的任何东西.@InjectMock对象,调用您正在测试的方法......模拟应该被挂钩并按照前面步骤中的定义进行操作.因此,对于我上面使用的示例类,test/mock的代码将Connection作为模拟返回,您可以执行任何操作.根据我的问题上面的例子,这就是代码的样子:
@RunWith(PowerMockRunner.class)
@PrepareForTest({/* Static Classes I am Mocking */})
public class ExampleTest {
@Mock (name = "queueFactory") //same name as private var.
QueueConnectionFactory queueFactoryMock;
@Mock
Connection connectionMock; //the object we want returned
@InjectMocks
Example exampleTester; //the class to test
@Before
public void setup(){
MockitoAnnotations.initMocks(this); // initialize all the @Mock objects
// Setup other Static Mocks
}
@Test
public void testTestMe(){
//Mock your objects like other "normally" mocked objects
PowerMockito.when(queueFactoryMock.createConnection()).thenReturn(connectionMock);
//...Mock ConnectionMock functionality...
exampleTester.testMe();
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
32000 次 |
| 最近记录: |