- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试按如下方式 stub 我的模拟,
when(someMock.someMethod(Matchers.<SomeInterface<MyType>> any()).thenReturn(someValue);
和,
when(someMock.someMethod(Matchers.<SomeInterface<Map<String,Boolean>>> any()).thenReturn(someOtherValue);
我注意到第二个 stub 覆盖了第一个 stub 。所以即使我调用 someMock.someMethod(new SomeInterfaceImplementation());
someOtherValue
我不确定这里缺少什么。我尝试查看 Mockito 文档以了解此特定用例,但没有找到任何内容。
任何帮助/指点将不胜感激。
最佳答案
由于类型删除,Mockito 将无法在运行时确定 SomeInterface<T>
实例的泛型参数传递给 someMock.someMethod
.任何电话 someMethod
似乎是用 SomeInterface
的实例制作的没有通用参数。
Matchers 的 JavaDoc用警告暗示这个问题(尽管它没有解释原因):
The any family methods don't do any type checks, those are only here to avoid casting in your code. If you want to perform type checks use the isA(Class) method. This might however change (type checks could be added) in a future major release.
还有一些其他辅助方法,例如 anyListOf
它似乎处理 Collections 的泛型参数,但这些只是为了方便而存在,实际上不会检查泛型类型:
Generic friendly alias to anyList(). It's an alternative to @SuppressWarnings("unchecked") to keep code clean of compiler warnings.
Any List or null.
This method don't do any type checks, it is only there to avoid casting in your code. This might however change (type checks could be added) in a future major release.
因为 any()
匹配器将匹配任何对象,无论类型和通用参数如何,第二次调用 when()
与 any()
将覆盖第一个。此问题的唯一解决方案是调用 when(...)
两种类型的调用仅一次,并进行某种运行时检查以确定结果应该是什么(例如,在 Answer
中传递给 thenAnswer
)。
例如,假设我们要模拟以下类(真的不值得模拟,但请耐心等待):
public class SomeClass {
public <T> T getFirst(List<T> list) {
return list.get(0);
}
}
getFirst
方法与您的类有相同的问题,因为使用 any
/isA
/anyList
/anyListOf
匹配器将无法区分 List<String>
和 List<Integer>
.
这是用 andAnswer
来模拟它的一种方法:
@Test
public void testGetFirst() {
SomeClass mock = mock(SomeClass.class);
when(mock.getFirst(Matchers.<List<?>>any())).thenAnswer(new Answer<Object>() {
@Override
public Object answer(InvocationOnMock invocation) {
List<?> list = (List<?>) invocation.getArguments()[0];
// Inspect the contents of the list to know which type to return
Object first = list.get(0);
if (first instanceof String) {
return "Z";
} else if (first instanceof Integer) {
return 1000;
} else {
return null;
}
}
});
String firstString = mock.getFirst(Arrays.asList("A", "B", "C"));
System.out.println(firstString); // prints Z
Integer firstInteger = mock.getFirst(Arrays.asList(1, 2, 3));
System.out.println(firstInteger); // prints 1000
}
这非常难看,而且根据您实际泛型类型的使用方式可能很难实现,但我相信这是解决运行时缺少泛型类型信息的唯一方法。
关于java - Mockito.when stub 被覆盖,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24615841/
我有以下 Spring 代码要使用 Spock 进行测试: @Service @RequiredArgsConstructor public class MyService { private f
package main import ( "fmt" "github.com/hyperledger/fabric/core/chaincode/shim" pb "gith
我刚开始使用Wiremock,但对 stub 有疑问。 从文档看来,您似乎可以在映射下使用JSON文件,也可以在Java代码中使用代码stubFor(get(urlEqualTo(...。但是,我发现
我有以下要测试的对象: public class MyObject { @Inject Downloader downloader; public List readFi
我看到它被使用过很多次,但从未真正停下来质疑过它。现在我想知道 stub 和 stub 之间是否有区别! 有吗?还是历史原因? stub !意思是它 stub 一次?并返回到正常的方法调用? 最佳答案
在 Jasmine 中,如何创建一个纯 stub ,其中所有方法都已 stub 并返回未定义? 最佳答案 我认为没有任何现成的东西可以做到这一点,但您可以创建自己的。 describe('Stub a
两个类。父级:B。子级:A。A.method1() 覆盖 B 的。 public class B { protected boolean method1(){...}; } public cl
我有一个函数依赖于另一个函数,而不是测试依赖性我只想测试该依赖函数的特定结果。但是,当我对函数进行 stub 时,什么也没有发生,返回结果就好像我一开始就没有对函数进行 stub 一样。 示例代码:
这是要测试的代码: const AWS = require('aws-sdk'); const { APPLICATIONS, NOTIFICATION_FREQUENCIES } = req
背景 Any client socket program(C) over TCP/IP looks like, /* Socket creation */ sockfd = socket(AF_I
我正在尝试使用 stub 提供程序(我从 this 问题的答案中得到)和 stub 验证器来实现一个简单的同步适配器。对于身份验证,我使用了基本的 sync adapter example由谷歌提供。
与在测试点使用模拟框架(如 Rhino Mocks)相比,是否存在手动创建 stub 类型更有利的情况。 我们在项目中采用了这两种方法。当我查看一长串对象的 stub 版本时,我的直觉是它会增加维护开
我想 stub doSomething 来回调错误。但是,我只希望它在第一次响应时回调并出现错误。我想在第一次调用后恢复 stub 为了 stub 第一个调用,我可以这样做: var stub = s
我有一个 TimeMachine 类,它为我提供当前日期/时间值。该类看起来像这样: public class TimeMachine { public virtual DateTime Ge
如果我有一个 Rhino Mock 对象,它已经像这样声明了一个 stub 调用: mockEmploymentService.Stub(x => x.GetEmployment(999)).Retu
通常使用 Mockito,如果你 stub 一个被多次调用的方法,你会这样做 Mockito .doReturn(0) .doReturn(1) .doReturn(2)
逻辑 public class Logic { String date = (LocalDateTime.now()).format(DateTimeFormatter.ofPattern("yyyy
我想达到的目的 At the time of compilation, the compiler knew the function call was valid because you includ
这可能是一个简单的问题,但我无法缩短它。 我正在测试我的一个类,ClassToTest。在生产中,它将对第三方库对象(ThirdPartyClass 的实例)执行操作。 我想用 stub 模拟那个类。
我是 js 单元测试的新手,对使用 withArgs 进行 stub 有疑问。 我有一些名为“create”的通用外部函数,我只想为某种参数和原始“create”的其他返回值 stub 它。例如: s
我是一名优秀的程序员,十分优秀!