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

如何在构造函数中为@value设置值以进行测试[duplicate]

公西凯捷
2023-03-14

我有以下构造函数

// many other variables not relevant for this question
private final boolean ignore;

public Client(@Value("${a.error}") boolean ignore) {
    // setting many other variables not relevant for this question
    this.ignore = ignore;
}

测试时:

@Before
public void setUp() {
    client = new Client(true);
    //many other setups
}

// tests correctly fine cos I set the ignore to true
@Test
public void testing(){
    // someMethod uses the ignore value to do some actions and return true / false
    assertTrue(client.someMethod());
}

@Test
public void howToTestIgnoreSetToFalse(){
    // ? 
}

共有1个答案

柴寂离
2023-03-14

这里我可以建议3个解决方案:

  1. 通过Spring使用ReflectionUtils
@Before
public void setUp() {
    client = new Client(true);
    // rest of initialization
}

@Test
public void testing(){
    assertTrue(client.someMethod());
}

@Test
public void howToTestIgnoreSetToFalse(){
    Field fieldIgnore = Client.class.getDeclaredField("ignore");
    ReflectionUtils.makeAccessible(fieldIgnore);
    ReflectionUtils.setField(fieldIgnore, client, false);

    assertFalse(client.someMethod());
}
@Test
public void howToTestIgnoreSetToFalse(){
    Field fieldIgnore = Client.class.getDeclaredField("ignore");
    // only the way of how you're initializing field is changed,
    // everything else is the same
    fieldIgnore.setAccessible(true);
    Field modifiersField = Field.class.getDeclaredField("modifiers");
    modifiersField.setAccessible(true);
    modifiersField.setInt(f, f.getModifiers() & ~Modifier.FINAL);
    fieldIgnore.set(client, false);

    assertFalse(client.someMethod());
}
// setup method doesn't required anymore

@Test
public void testing(){
    Client client = createClient(true);
    assertTrue(client.someMethod());
}

@Test
public void howToTestIgnoreSetToFalse(){
    Client client = createClient(false);
    assertTrue(client.someMethod());
}

// factory method to prepare mocked/initialized instance
private static Client createClient(boolean ignore) {
    Client client = new Client(ignore);
    // do common initialization
    // setup your mocks
    return client;  
}

希望有帮助!

 类似资料:
  • 问题内容: 我有一堂课要添加单元测试。该类具有多个构造函数,这些构造函数采用不同的类型并将其转换为规范形式,然后可以将其转换为其他类型。 实际上,它接受并转换为其他两种类型。 我正在尝试找出最合适的方法来测试这些构造函数。 应该有一个针对每个构造函数的测试和输出类型: 这导致许多不同的测试。如您所见,我正在努力命名它们。 应该有多个断言: 这有多个断言,这使我感到不舒服。它还正在测试getStri

  • 我目前在我的大学学习初级java课程,仍然在学习编程的基础知识。这周我们一直在学习构造函数,我被困在本周任务的后半部分,所以任何帮助都将不胜感激。 实验室的第二部分(我一直坚持的部分)的说明如下: 为类Truck编写完整的代码,如下面的类图所示。一定不要在构造函数中使用重复的代码。例如,具有2个参数的构造函数应该调用具有1个参数的构造函数来设置柱体的值。 这些是它想让我做的构造函数。 任何关于如何

  • 例如,我有一个这样的课; 我要做的是为模拟的构造函数编写单元测试。 如果是静态的,那么这将很容易,因为我可以使用然后调用构造函数。 有人知道有什么办法吗?

  • 以下MySQL查询是等效的: 然而,行构造器表单(即第一个示例)的强大之处在于,您可以使用它来处理查询任意长度的值对列表。没有它,您必须编写动态sql,这是一个安全风险。使用第一个表单避免了这个棘手的问题。 但是,如何使用预准备状态在JDBC中表示这一点?例如: 我已经研究了setArray,但是如何在数组的值中表示列1和列2的值?我想知道是否接口可以作为这个管道。但是阅读文档时,我看不出它是如何

  • 我想在Oracle对象类型中设置默认值,但它需要在构造函数中传递所有属性。 是否存在,以便我可以只传递构造函数中需要默认值的必需属性。 请参阅以下详细信息 现在,在上面的例子中,若我只在构造函数中传递Col3和Col4属性作为默认值,那个么它就不起作用了。请参见下面的示例。