首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >想要春豆既能被模仿又能真正的implementations+spring+mockito

想要春豆既能被模仿又能真正的implementations+spring+mockito
EN

Stack Overflow用户
提问于 2015-01-28 07:08:40
回答 4查看 147关注 0票数 0

我有一个Service类,我想测试它。基本上,我面临一个问题,因为我希望Service对象被部分地模拟。只有obj1应该被嘲笑,其他的协作者应该是真实的。我的代码类似于以下内容:

代码语言:javascript
复制
@Component
public class Service {

    @Autowired
    Object1 obj1;

    @Autowired
    Object2 obj2;

    public void validate(){
        obj1.isValid();
        obj2.isActive();

    }
}

现在,在测试上述Service类的验证方法时,我希望在调用obj2的实际实现时模拟obj1.isValid()方法。

代码语言:javascript
复制
@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。我将以下内容添加到测试类中,如下所示,但结果仍然相同:

代码语言:javascript
复制
@ReplaceWithMock
@Autowired  
Object2 obj2
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2015-01-28 07:41:44

您必须将@Autowired注释添加到service对象中,以便正常注入service中的所有其他属性,并为模拟类型注入模拟对象。

在下面的示例中,Class2的普通bean将在service中注入,但是@InjectMocks注释将注入Class1的模拟对象。

服务

代码语言:javascript
复制
@Component
public class Service
{
    @Autowired
    private Class1 class1;

    @Autowired
    private Class2 class2;

    public Class1 getClass1()
    {
        return class1;
    }

    public Class2 getClass2()
    {
        return class2;
    }
}

Class1

代码语言:javascript
复制
@Component
public class Class1
{
    public String getName()
    {
        return "Class1";
    }
}

Class2

代码语言:javascript
复制
@Component
public class Class2
{
    public String getName()
    {
        return "Class2";
    }

}

测试

代码语言:javascript
复制
@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());
    }
}
票数 2
EN

Stack Overflow用户

发布于 2015-01-28 07:35:50

这可以通过@Spy来实现。

您的代码应该如下所示

代码语言:javascript
复制
public class ServiceTest {

    @InjectMocks
    Service service;

    @Mock
    OBject1 obj1;

    @Spy 
    Object obj2 = new SomeObject("argument");

    @Before
    public void setUp() {
        MockitoAnnotations.initMocks(this);
    }
}
票数 0
EN

Stack Overflow用户

发布于 2015-01-28 13:44:32

实现这一目标的另一种方法是使用springocito。

代码语言:javascript
复制
@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进行填充。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28186523

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档