2016-06-07 92 views
1

合格豆考虑我的情况使用嘲讽为的Mockito弹簧启动应用程序

public class SomeClass { 
    @Autowired @Qualifier("converter1") private IConverter converter1; 
    @Autowired @Qualifier("converter2") private IConverter converter2; 

    public void doSomeAction(String mimeType) { 
    converter1.execute(); 
    converter2.execute(); 
    } 
} 

这是我的代码。

为了测试这个

@RunWith(MockitoJUnitRunner.class) 
public class SomeClassTest { 
    @Mock(name="converter1") IConverter converter1; 
    @Mock(name="converter2") IConverter converter2; 
    @InjectMocks SomeClass class = new SomeClass(); 
    @Test 
    public void testGetListOfExcelConverters() throws Exception { 
    class.doSomeAction("abcd"); 
    } 
} 

这里嘲笑没有得到注入,请与嘲讽一个合格的豆适当的机制帮助。

如果这不是使用spring编写代码的正确方法,请让我知道使用此方法的正确方法。

回答

3

您可以使用测试配置嘲笑豆:

@Configuration 
public class TestConfig { 
    @Bean 
    public MyService myService() { 
     return Mockito.mock(MyService.class); 
    } 
} 
+0

并查看https://tedvinke.wordpress.com/2014/02/13/mockito-why-you-should-not-use-injectmocks-annotation-to-autowire-fields/关于如何使用InjectMocks以及为什么你不应该^^ – riddy

+0

感谢您的链接,它真的很有帮助。我将从我的项目中删除注入。第二,如何在测试类中指定配置类,如果可能的话可以提供一些例如。 – amith

+0

很简单,如果测试文件夹中的配置类的包名称与src文件夹中的包名称匹配,它将自动完成。 – riddy

2

不知道你做了什么错误,但您的测试类没有编译,因为你有什么样子你打算要使用一个变量名关键字class。这对我有效:

@RunWith(MockitoJUnitRunner.class) 
public class SomeClassTest { 
    @Mock(name="converter1") IConverter converter1; 
    @Mock(name="converter2") IConverter converter2; 

    @InjectMocks 
    SomeClass clazz = new SomeClass(); 

    @Test 
    public void testGetListOfExcelConverters() throws Exception { 
     clazz.doSomeAction("abcd"); 
     verify(converter1).execute(); 
     verify(converter2).execute(); 
    } 
} 

而“为我工作”,我的意思是测试实际上运行并通过。注意我添加了一些verify声明来声明注入的模拟被调用。

我使用了您提供的SomeClass代码。

+0

抱歉有关班级的错字,感谢您纠正错误。我使用springboot,但一些如何我的依赖没有得到设置,我在调用converter1.execute()时得到NPE。如果可能的话,你可以对可能出现的问题提出一些看法。 – amith

+0

您必须提供有关您的实际班级和/或配置的更多详细信息。正如我所说,你提供的例子基本上是可行的(一旦你修正了错字),所以我不能真正猜出有什么不对。 – jhericks