在Java中注入类字段

时间:2011-02-03 01:41:23

标签: java unit-testing code-injection

大家好 我有一个软件,我想运行很多次,每个软件都是在类的构造函数中设置的类字段的特定值。
例如,代码中的某处是

的内容
public class Stuff
{
   private double importantVal;
   public Stuff(double val)
   {
      this.importantval = val;
   }
   public double doStuff()
   {
      return 4 * importantVal;
   }
}

这个类和方法在程序/调用堆栈中很远,所以我不能单独调用doStuff几次。
我想测试程序中各种值的importantVal,可能是将它们放在一个文件中并迭代它们。我计算了很多次运行程序的简单方法,但我不知道如何替换不同的importantVal值。如果所有其他方法都失败了,我总是可以编写一个修改源代码的脚本,但这会让人感觉很丑陋。是否有一个更优雅的解决方案涉及注射,或沿着这些线?

3 个答案:

答案 0 :(得分:3)

为了说明人们在这里告诉你的内容,以下是测试用例的外观: -

public class StuffTest {

    @Test
    public void testDoStuff_Zero(){
        Stuff stuff = new Stuff(0);
        assertEquals(0, stuff.doStuff());
    }

    @Test
    public void testDoStuff_One(){
        Stuff stuff = new Stuff(1);
        assertEquals(4, stuff.doStuff());
    }

    @Test
    public void testDoStuff_NegativeValue(){
        Stuff stuff = new Stuff(-10);
        assertEquals(-40, stuff.doStuff());
    }

    @Test
    public void testDoStuff_PositiveValue(){
        Stuff stuff = new Stuff(10);
        assertEquals(40, stuff.doStuff());
    }

    @Test
    public void testDoStuff_DecimalValue(){
        Stuff stuff = new Stuff(1.1);
        assertEquals(4.4, stuff.doStuff());
    }
}

答案 1 :(得分:0)

public class StuffRunner {
    public static void main(String[] args) {
        double x = 0.0d;

        for (int i = 0; i < 100; ++i) {
            Stuff s = new Stuff(x);

            if (s.doStuff() != 4 * x) {
                System.out.print("Error, unexpected value. X=");
                System.out.println(x);
            }

            x = x + 1.22;
        }
    }
}

答案 2 :(得分:0)

你有Stuff类的多个实例吗?如果没有,也许你可以通过使importantVal静态来尝试“注入”这些值?或者注入多个值使用List?

public class Stuff{

   private static List<Double> testVals = new LinkedList()<Double>;
   private double importantVal;
   public Stuff(double val)
   {
      this.importantval = val;
   }

   public static addTest(double test){
       testVals.add(test);
   }

   public double doStuff()
   {
      return 4 * testVals.removeFirst();
   }

}