当前位置: 首页 > 知识库问答 >
问题:

如何模拟一个自动连线的春豆列表?

柴高岑
2023-03-14

我读了很多关于如何模拟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列表,同时仍然有可能模拟特定的实现。

你有解决问题的想法吗?

问候

共有1个答案

吕宣
2023-03-14

我终于想通了...

有时候,问一个问题可以给你一个更好的解决问题的方法: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应用程序使用其应用程序卡片做这种事情)。这里有一个例子: 以下是我的应用程序目前的外观: 如您所见,卡片只是拉伸,不适合由方向更改形成的空白空间。那么我该怎么做呢? 代码: 片段布局: 片段项目布局: