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

通过Mockito注入字符串

仲璞瑜
2023-03-14

在我的类中,在测试businessflow下,我有一些私有服务字段和一个javastring类型的私有字段。

@RunWith(MockitoJUnitRunner.class)
public class BusinessFlowTest {
    // How can I mock or spy this?
    private String code = "codeValue";
    @Mock
    private Service1Api service1;
    @Mock
    private Service2Api service2;
    @InjectMocks
    private BusinessFlow flow;
    ...
}

@injectmocks@mock注释极大地创建了模拟和注入服务字段。但是,如何为code字段创建模拟,因为Mockito不允许为final类创建模拟?

我看到的一个选择是使用charsequence接口而不是string字段类型,但这需要更改businessflow类的代码,我不喜欢这种想法。

更新:类businessflow定义如下

@Service
public class BusinessFlow {
    @Autowired
    @Qualifier(value = "clientCode")
    private String code;

    @Autowired
    private Service1Api service1;
    @Autowired
    private Service2Api service2;

    ...
}

由于某些原因,我们没有使用Spring集成测试功能,也不想在不同类型的注入(例如ctor注入)中返工businessflow

共有1个答案

欧阳楚
2023-03-14

模拟是用来模拟外部依赖关系的,这些依赖关系要么太过禁忌,无法在测试上下文中旋转,要么没有必要这样做。您可以模拟服务和DAO层访问点这样的东西,以确保您所做的只是一个单元测试。

您想要做的是为您运行的每个测试更改该字段的值,而不依赖于您的模拟。记住-那些模拟是外部依赖项。你可以很容易地控制*进入你的类的字符串。

有关测试中的示例:

@Test
public void testWithFoo() {
    // given
    flow.setValue("foo");

    // when
    // invoke a pertinent method

    // then
    // observe results
}

*:如果做不到,这是重构的好机会。

 类似资料:
  • 当使用@InjectMocks时,它会自动尝试按照以下顺序进行注入:构造器、设置器、字段。它通过检查类型来检查是否可以在这些地方中注入,然后在有多种类型的可能性时命名。这对我来说不太好用,因为我的模拟映射锁实际上是通过它的setter注入到dontMockMe中的。我无法编辑此抽象类。有什么办法让我绕过塞特注射吗?提前谢谢!

  • 我是Spring Security的新手。我看过很多关于如何通过外部属性文件的注释注入值的文章。我尝试了很多方法,但最终都是用java。lang.IllegalArgumentException:无法解析占位符“val.id”异常。 你能给我一些提示如何处理这个例外吗? 我的java类如下所示: 我的属性文件名为val.properties,位于WEB-INF下,其内容为val.id=xyz 我将

  • 问题 你想导入一个模块,但是模块的名字在字符串里。你想对字符串调用导入命令。 解决方案 使用importlib.import_module()函数来手动导入名字为字符串给出的一个模块或者包的一部分。举个例子: >>> import importlib >>> math = importlib.import_module('math') >>> math.sin(2) 0.9092974268256

  • 我对摩基托并不陌生,但这次我在工作中发现了一个有趣的案例。我希望你能帮我解决这件事。 我需要注入mock来改变测试过程中的某些方法行为。问题是,bean结构是嵌套的,并且这个bean在其他bean内部,不能从test方法访问。我的代码如下所示: 所以在我的测试中,我希望调用nestedDAO.method返回模拟答案。 我尝试执行一个initmocks: 还要在我的测试类上添加注释: 总是从方法获

  • 这是我的代码: 如何根据爱好对学生进行分组。我尝试了以下代码: 它没有给出正确的答案。

  • 我知道如何计算出字符串中某个字符或数字的索引,但是有没有任何预定义的方法可以用来给我第n个位置的字符?所以在字符串“foo”中,如果我要求索引为0的字符,它会返回“f”。 注意——在上面的问题中,我所说的“字符”不是指字符数据类型,而是字符串中的字母或数字。这里重要的一点是,调用该方法时,我不会收到char,而是一个字符串(长度为1)。我知道substring()方法,但我想知道是否有更简洁的方法