public class MyClass {
protected OtherClass other;
public MyClass(String arg) {
this.other = new OtherClass(arg);
}
public void doSomething() {
String response = other.sendRequest(); // mock this call
// ...
}
}
我想测试doSomething()
,为此,我需要模拟调用sendrequest()
。为此,我尝试了以下方法,但没有成功:
@Test
public void doSomethingTest() {
MyClass myClass = new MyClass("test");
when(myClass.other.sendRequest()).thenReturn("response");
myClass.doSomething();
}
仍然在调用真正的sendrequest()
而不是返回模拟响应。
如何使用Mockito模拟对sendrequest()
的调用?
如果在MyClass
类中实例化OtherClass
对象,那么实际上不可能模拟它,您需要在MyClass
之外实例化它,然后将它注入到MyClass
中(例如通过其构造函数)。
然后在测试中所需要做的就是模拟对mockOtherClass
对象的调用。并使用它实例化MyClass
对象
将MyClasss更改为
public class MyClass {
protected OtherClass other;
public MyClass(OtherClass otherClass) {
this.other = otherClass;
}
public void doSomething() {
String response = other.sendRequest();
}
}
您的代码将从
MyClass myClass = new MyClass("s");
OtherClass other = new OtherClass("s");
MyClass myClass = new MyClass(other);
@Test
public void doSomethingTest() {
OtherClass other = mock(OtherClass.class);
when(other.sendRequest()).thenReturn("response");
MyClass myClass = new MyClass(other);
myClass.doSomething();
// .. test assertions
}
问题内容: 我在Python中使用时遇到了一些困难: 测试实际上返回正确的值,但它是Mock对象,不是。您如何在Python库中模拟属性? 问题答案: 您需要使用和: 这意味着:调用时,在该调用的返回值上,为属性设置a以返回value 。
问题内容: 我正在使用ref为组件编写测试。我想模拟ref元素并更改一些属性,但不知道如何做。有什么建议? 问题答案: 根据https://github.com/airbnb/enzyme/issues/1937中的讨论,这就是解决方案 可以使用非箭头函数对类进行猴子修补,其中“ this”关键字将传递到正确的作用域。
问题内容: 我正在将我的某些类从对getter和setter的广泛使用改为对属性的更pythonic的使用。 但是现在我陷入了困境,因为以前的一些getter或setter方法会调用基类的相应方法,然后执行其他操作。但是如何通过属性来实现呢?如何在父类中调用属性getter或setter? 当然,仅调用属性本身即可进行无限递归。 问题答案: 您可能认为您可以调用由属性调用的基类函数: 尽管我认为这
问题内容: 我在某些测试中使用Mockito。 我有以下课程: 我只想模拟的第二个调用。第一次调用必须调用real方法。有没有办法做到这一点? 问题答案: Mockito不支持此功能。 这可能不是你要寻找的答案,但是你看到的是不采用设计原则的症状: 偏重于继承而不是继承 如果你提取策略而不是扩展超类,那么问题就不存在了。 但是,如果不允许你更改代码,但无论如何都必须对其进行测试,并且以这种尴尬的方
我试图为一个类编写一个单元测试,这个类使用带有库中的的Google vision API。问题是,由于某种原因,我的模拟仍然调用真正的方法,然后抛出一个NPE,这破坏了我的测试。我以前从未在模拟上见过这种行为,我想知道我是不是做错了什么,是不是Spock/Groovy中有bug,还是与Google lib有关?
基类 在派生类中不应用组合和其他函数。如果是,我是否应用了错误的模式?我应该如何处理相同的?