为什么不传递到 Mockito.什么时候不使用?



我认为我要么对工作方式存在基本的误解,要么更具体地说,Mockito是如何工作的。

我有一个服务类,它有一个通过构造函数注入的实用程序类。实用程序类还具有构造函数自动连接的其他一些依赖项。

服务类方法调用实用程序类中的多个方法。测试在调用的实用程序方法上使用when/thenReturn语句。当我调用服务方法时,我在使用 null 参数调用的实用程序方法上获得 NPE。但是我希望在when子句中设置的参数被设置。代码如下:

@Service
public class ServiceClass {
private Utility utility;
public ServiceClass(Utility utility) {
this.utility = utility;
}
public serviceMethod(MyDocument myDocument, List<Attachment> attachments) {
SomeType variable1;
OtherType variable2;
List<String> stringList;
long time;
time = utility.method1(variable1, variable2);
stringList = utility.method2(myDocument, attachments.get(0));
...
}
@Service
public class Utility {
private Dependency1 depend1;
private Dependency2 depend2;
public Utility(Dependency1 depend1, Dependency2 depend2) {
this.depend1 = depend1;
this.depend2 = depend2;
}
public long method1(SomeType var1, OtherType var2) {
....
}
public List<String> method2(MyDocument myDoc, Attachment attach) {
....
}

现在测试代码如下所示:

public TestClass {
private ServiceClass serviceClass;
@Mock
private Depend1 depend1;
@Mock 
private Depend2 depend2;
@InjectMocks
private Utility utility;
@Rule
public MockitoRule rule = MockitoJUnit.rule();
@Before
public void setup() {
serviceClass = new ServiceClass(utility);
}
@Test
public testServiceMethod() {
long time = System.currentTimeMillis();
MyDocument doc = new MyDocument();
List<Attachments> attachments = Arrays.asList(new Attachment(...), new Attachment(...));
SomeType some = new SomeType();
OtherType other = new OtherType();
when(utility.method1(some, other)).thenReturn(time);
when(utility.method2(doc, attachments.get(0)).thenReturn(Arrays.asList(new String("stg 1"), new String("stg 2"));
String resp = serviceClass.serviceMethod(doc, attachments);
assertEquals("service completed", resp);
}
}

但是当调用utility.method2时,myDocument显示为空。我期待它会是MyDocument的一个实例。

我有配置错误的东西吗?我在这里错过了一个概念吗?所有的帮助感谢!

谢谢。

更新更正了 serviceMethod 的参数。

ServiceClass

是您要测试的类,因此您应该在测试中仅@Mock注释此类的依赖项,在您的情况下为utility属性,删除Depend1Depend1声明。setup方法不是必需的,您可以使用@InjectMocks在测试中注释serviceClass,而是自动处理进样。最后,您的TestClass需要@RunWith(MockitoJunitRunner.class)来使一切正常(如果它不存在(。

@RunWith(MockitoJunitRunner.class)
public class TestClass{
@InjectMocks
private ServiceClass serviceClass;
@Mock
private Utility utility;
} 

这是 TestClass 的基本定义,测试本身看起来是正确的,但可以改进为在 "when" 子句上使用ArgumentMatchers并使用ArgumentCaptor添加一个verify子句来验证参数。

相关内容

  • 没有找到相关文章

最新更新