我读了很多关于如何模拟Spring的bean和它们的自动连线场的文章。但我找不到任何关于豆子的autowired列表。
具体问题
@Component
public class FormValidatorManager implements IValidatorManager {
@Autowired
private List<IFormValidator> validators;
@Override
public final IFieldError validate(ColumnDTO columnToValidate, String sentValue) {
String loweredColName = columnToValidate.getName().toLowerCase();
IFieldError errorField = new FieldError(loweredColName);
for (IEsmFormValidator validator : validators) {
List<String> errrorsFound = validator.validate(columnToValidate, sentValue);
//les erreurs ne doivent pas être cumulées.
if(CollectionUtils.isNotEmpty(errrorsFound)){
errorField.addErrors(errrorsFound);
break;
}
}
return errorField;
}
}
我想测试一下这门课。但我找不到模拟validators
属性的方法。
我所尝试的
由于IFormValidators
是单例,我尝试模拟这些bean的几个实例,希望它们能够反映在FormValidatorManager.Validators
中,但没有成功。
然后,我尝试创建一个IFormValidators
列表,该列表被注释为@mock
。通过手动启动列表
,我希望initmocks()
注入创建的列表。这仍然没有成功。
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations={"classpath:spring/test-validator-context.xml"})
public class FormValidatorManagerTest {
@Mock
private RegexValidator regexValidator;
@Mock
private FormNotNullValidator notNullValidator;
@Mock
private FormDataTypeValidator dataValidator;
@InjectMocks
private FormValidatorManager validatorManager;
@Mock
private List<IEsmFormValidator> validators = new ArrayList<IEsmFormValidator>();
@Mock
private ColumnDTO columnDTO;
@Before
public void init() {
validators.add(notNullValidator);
validators.add(regexValidator);
validators.add(dataValidator);
MockitoAnnotations.initMocks(this);
Mockito.when(columnDTO.getTitle()).thenReturn("Mock title");
Mockito.when(columnDTO.getName()).thenReturn("Mock name");
}
@Test
public void testNoErrorFound(){
mockValidator(notNullValidator, new ArrayList<String>());
mockValidator(regexValidator, new ArrayList<String>());
mockValidator(dataValidator, new ArrayList<String>());
IFieldError fieldErrors = validatorManager.validate(columnDTO, "Not null value");
Assert.assertEquals(0, fieldErrors.getErrors().size());
verifyNumberOfValidateCalls(regexValidator, Mockito.atMost(1));
verifyNumberOfValidateCalls(dataValidator, Mockito.atMost(1));
verifyNumberOfValidateCalls(notNullValidator, Mockito.atMost(1));
}
private void mockValidator(IFormValidator validator, List<String> listToReturn){
Mockito.when(validator.validate(Mockito.any(ColumnDTO.class), Mockito.anyString())).thenReturn( listToReturn );
}
private void verifyNumberOfValidateCalls(IFormValidator validator, VerificationMode verifMode){
Mockito.verify(validator, verifMode).validate(Mockito.any(ColumnDTO.class), Mockito.anyString());
}
}
在IFormValidator.validate()
中抛出了一个NPE,我认为这会被嘲笑。具体实施不应该叫。
这导致了一个非常糟糕的行为,因为我对那个类的一些测试是假阳性,而另一些则完全失败。
我试图弄清楚如何模拟一个自动连线的bean列表,同时仍然有可能模拟特定的实现。
你有解决问题的想法吗?
问候
我终于想通了...
有时候,问一个问题可以给你一个更好的解决问题的方法:p
问题是,在验证器被嘲笑之前,我正在将它们链接到列表。然后,验证器为空,当调用mockitAnnotations.initmocks(this)
时,无法更新任何引用。
以下是最终的解决方案:
@Mock
private EsmRegexValidator regexValidator;
@Mock
private EsmFormNotNullValidator notNullValidator;
@Mock
private EsmFormDataTypeValidator dataValidator;
@InjectMocks
private EsmFormValidatorManager validatorManager;
@Spy
private List<IEsmFormValidator> validators = new ArrayList<IEsmFormValidator>();
@Mock
private ColumnDTO columnDTO;
@Before
public void init() {
MockitoAnnotations.initMocks(this);
validators.add(notNullValidator);
validators.add(regexValidator);
validators.add(dataValidator);
Mockito.when(columnDTO.getTitle()).thenReturn("Mock title");
Mockito.when(columnDTO.getName()).thenReturn("Mock name");
}
我试图模拟一个使用JAXRS的类,这个类是一个spring组件。
问题内容: 有没有一种方法可以自动将Spring bean投射到应用程序上下文XML中定义的类?我想避免将有关Bean的类型信息放在2个地方....在xml配置文件以及代码中作为强制转换。 例如,给定此配置文件 我可以这样调用以避免避免将返回类型直接转换为。我知道我也可以打电话避免强制转换本身,但是我仍然在2个地方输入了类型信息。 看起来Spring可以获取类信息()或从Bean本身获取类型,但是
当我运行这个测试时,我会得到以下输出(如果我的服务不需要另一个bean,我会得到预期的输出) 由于这个响应,我在line.andExpect(content().contentType(Mediatype.application_json_utf8));上遇到了问题。当我检查response body时(因为body也是空的) 再现问题的示例项目在这里
我有一个类。并且我已经编写了一个类的单元测试方法的类。我的代码如下:- 在我的单元测试课上,我编写了以下方法。 当我执行测试类,我得到错误。这是因为在类中,在方法的第8行中,学生机构映射字段为null。这只发生在模拟对象上。如何获得模拟对象的自动生成字段?
我想知道是否有办法模拟正在自动连线的场。 考虑下面的情况。 我有一个班级名A 另一个B类看起来像这样 现在我想为这个方法编写junit。 我知道有一种方法可以像这样模拟自动连线场。 但我的问题是- eg 请提出建议,否则就没有办法了???? 我不想改变私人生活。我也不想添加getter和setter或reflection。我只是想知道,在创建一个类的新对象之后,有没有办法模拟B实例。
我有一个显示卡片视图的带有GridLayoutManager的RecyclerView。我希望卡片根据屏幕大小重新排列(Google Play应用程序使用其应用程序卡片做这种事情)。这里有一个例子: 以下是我的应用程序目前的外观: 如您所见,卡片只是拉伸,不适合由方向更改形成的空白空间。那么我该怎么做呢? 代码: 片段布局: 片段项目布局: