ArgumentCaptor 正在捕获其他 类
ArgumentCaptor is capturing other classes
我只想捕获一个 class,我们称它为 X,其中 X 扩展了 A。还有其他 class 也扩展了 A(例如 Y 和 Z)。
当我尝试捕获 X 时,出于某种原因,它似乎也捕获了扩展 A 的所有其他 classes(例如 Y 和 Z)。
我已经像这样指定了我的捕获:
ArgumentCaptor<X> xCaptures = ArgumentCaptor.forClass(X.class);
verify(someService, atLeastOnce()).someMethod(xCapture.capture());
但是,当我尝试获取所有值时,通过
xCaptures.getAllValues()
我可以看到它也将包含所有“兄弟”classes。
如果我将捕获的 class 从 X 更改为 Y 似乎也是如此。
为什么会发生这种情况,我该如何解决?
注意:我试图通过使用 instanceof
来过滤我们的其他 classes(我本来不应该这样做),但这会导致运行时错误因为它不能将一个 child class 转换为另一个
这里是classes的一般结构:
@Data
@AllArgsConstructor
@NoArgsConstructor
public class X extends A<XProperties> {
private SomeOtherClass c;
}
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Y extends A<YProperties> {
private SomeOtherClass c;
}
@Data
public class A<T> implements SomeInterface {
// some common fields
}
编辑:我应该注意到 someMethod
接受任何扩展 A,
的 class
void someMethod(A<?> childClass);
在我的流程中的某个时刻,这可能确实发生了,但是在我看来,捕获仍然应该过滤掉它们。
根据 https://www.agalera.eu/mockito-argumentcaptor-inheritance/,为了使用 Mockito 很好地处理 Java 类 中的继承,您需要做这样的事情(其中 A = Animal,X =狗和 Y = 猫):
Mockito.verify(animalProcessor, Mockito.times(2)).processAnimal(animalCaptor.capture());
List<Animal> processedAnimals = animalCaptor.getAllValues();
Optional<Animal> dogOptional = processedAnimals.stream()
.filter(a -> a instanceof Dog)
.findFirst();
Assert.assertTrue(dogOptional.isPresent());
我只想捕获一个 class,我们称它为 X,其中 X 扩展了 A。还有其他 class 也扩展了 A(例如 Y 和 Z)。
当我尝试捕获 X 时,出于某种原因,它似乎也捕获了扩展 A 的所有其他 classes(例如 Y 和 Z)。
我已经像这样指定了我的捕获:
ArgumentCaptor<X> xCaptures = ArgumentCaptor.forClass(X.class);
verify(someService, atLeastOnce()).someMethod(xCapture.capture());
但是,当我尝试获取所有值时,通过
xCaptures.getAllValues()
我可以看到它也将包含所有“兄弟”classes。
如果我将捕获的 class 从 X 更改为 Y 似乎也是如此。
为什么会发生这种情况,我该如何解决?
注意:我试图通过使用 instanceof
来过滤我们的其他 classes(我本来不应该这样做),但这会导致运行时错误因为它不能将一个 child class 转换为另一个
这里是classes的一般结构:
@Data
@AllArgsConstructor
@NoArgsConstructor
public class X extends A<XProperties> {
private SomeOtherClass c;
}
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Y extends A<YProperties> {
private SomeOtherClass c;
}
@Data
public class A<T> implements SomeInterface {
// some common fields
}
编辑:我应该注意到 someMethod
接受任何扩展 A,
void someMethod(A<?> childClass);
在我的流程中的某个时刻,这可能确实发生了,但是在我看来,捕获仍然应该过滤掉它们。
根据 https://www.agalera.eu/mockito-argumentcaptor-inheritance/,为了使用 Mockito 很好地处理 Java 类 中的继承,您需要做这样的事情(其中 A = Animal,X =狗和 Y = 猫):
Mockito.verify(animalProcessor, Mockito.times(2)).processAnimal(animalCaptor.capture());
List<Animal> processedAnimals = animalCaptor.getAllValues();
Optional<Animal> dogOptional = processedAnimals.stream()
.filter(a -> a instanceof Dog)
.findFirst();
Assert.assertTrue(dogOptional.isPresent());