我有一个Service类,我想测试它。基本上,我面临一个问题,因为我希望Service对象被部分地模拟。只有obj1应该被嘲笑,其他的协作者应该是真实的。我的代码类似于以下内容:
@Component
public class Service {
@Autowired
Object1 obj1;
@Autowired
Object2 obj2;
public void validate(){
obj1.isValid();
obj2.isActive();
}
}现在,在测试上述Service类的验证方法时,我希望在调用obj2的实际实现时模拟obj1.isValid()方法。
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration({"classpath:conf/test-context.xml"})
public class ServiceTest {
@InjectMocks
Service service;
@Mock
OBject1 obj1;
@Before
public void setUp() {
MockitoAnnotations.initMocks(this);
}
@Test
public void testValidate (){
service.validate();
//assert and other stuff
}
}这个测试失败了,当我调试验证方法时,我发现obj1实例在Service类中按预期的方式注入,而obj2被注入为null。所以测试失败了。有办法做到这一点吗?
当我读到一些答案时,更新了,我使用了springockito。我将以下内容添加到测试类中,如下所示,但结果仍然相同:
@ReplaceWithMock
@Autowired
Object2 obj2发布于 2015-01-28 07:41:44
您必须将@Autowired注释添加到service对象中,以便正常注入service中的所有其他属性,并为模拟类型注入模拟对象。
在下面的示例中,Class2的普通bean将在service中注入,但是@InjectMocks注释将注入Class1的模拟对象。
服务
@Component
public class Service
{
@Autowired
private Class1 class1;
@Autowired
private Class2 class2;
public Class1 getClass1()
{
return class1;
}
public Class2 getClass2()
{
return class2;
}
}Class1:
@Component
public class Class1
{
public String getName()
{
return "Class1";
}
}Class2:
@Component
public class Class2
{
public String getName()
{
return "Class2";
}
}测试
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration({
"classpath:application-context.xml"
})
public class ServiceTest
{
@Mock
private final Class1 class1 = Mockito.mock(Class1.class);
@InjectMocks
@Autowired
private Service service;
@Before
public void setup()
{
MockitoAnnotations.initMocks(this);
}
@Test
public void test()
{
Mockito.when(class1.getName()).thenReturn("MockClass1");
Assert.assertNotNull(service);
Assert.assertEquals("MockClass1", service.getClass1().getName());
Assert.assertNotNull("Class2", service.getClass2().getName());
}
}发布于 2015-01-28 07:35:50
这可以通过@Spy来实现。
您的代码应该如下所示
public class ServiceTest {
@InjectMocks
Service service;
@Mock
OBject1 obj1;
@Spy
Object obj2 = new SomeObject("argument");
@Before
public void setUp() {
MockitoAnnotations.initMocks(this);
}
}发布于 2015-01-28 13:44:32
实现这一目标的另一种方法是使用springocito。
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(loader = SpringockitoContextLoader.class,locations={"classpath:conf/test-context.xml"})
public class ServiceTest
{
@ReplaceWithMock
@Autowired
private Object1 object1
@Autowired
private Service service;
@Before
public void setup()
{
MockitoAnnotations.initMocks(this);
}
@Test
public void test()
{
//assert stuff
}
}服务将得到适当的填充,但Object1除外,它将对所有自动配置内部bean的模拟instance.Rest进行填充。
https://stackoverflow.com/questions/28186523
复制相似问题