模拟方法,但它调用实际方法

时间:2017-03-16 12:56:12

标签: java json unit-testing mockito

我正在尝试模拟对getJSONFile()的调用,该调用从json文件返回someJson对象。

public class NameClass{
    public String getValues() throws Exception 
            {
                HelpingClass e=new HelpingClass();
                String name=" ";
                String age=" "; 
                String gender=" ";
                JSONObject json= e.getJSONFile();
                json.getString("name");
                json.getString("age");
                json.getString("gender");
                System.out.println("Request received is "+json);
                ------ I have some other logic with JSON received and return string...

    }
}

这是我的getJSONFile()

public class HelpingClass{
     public JSONObject getJSONFile() throws Exception
        {
            System.out.println("Getting JSON file");
            File f = new File("src/main/resources/input.json");
            JSONObject json ;
            InputStream is = new FileInputStream(f);
            String jsonTxt = IOUtils.toString(is);
            json=new JSONObject(jsonTxt);
            return json;
        }
}

这是我的测试用例

@RunWith(MockitoJUnitRunner.class)
public class TestValues {

    @InjectMocks NameClass names;
    @Mock HelpingClass help;
    @Test
    public void testgetValues() throws Exception
    {
        //I am expecting this output
        JSONObject addValues=new JSONObject();
        addValues.put("name", "Rahul");
        addValues.put("age", "30");
        addValues.put("gender","male");
        //this is what i am returning when help.getJSONFile is called
        JSONObject json=new JSONObject();
        json.put("name", "Rahul");
        json.put("age", "30");
        json.put("gender", "male");
        //Mocking this call and returning my json
        Mockito.when(help.getJSONFile()).thenReturn(json);
        String s=names.getValues();
        Assert.assertEquals(addValues.toString(),s);
    }
}

现在不是返回创建的json,而是在文件中返回我的JSON,例如名字是Rohit年龄是28岁,性别是男性。

为什么这种嘲弄不起作用?从技术上讲,它应该调用mocked方法并在JSONObject类的json对象中返回值,即Rahul,30年和男性。

我哪里错了?

1 个答案:

答案 0 :(得分:3)

如果你在方法中实例化HelperClass,那么@InjectMocks就不会工作。

你必须使它成为一个实例变量或使用你将模拟的getter:

public class NameClass{

  public String getValues() throws Exception 
  {
            HelpingClass e= getHelpingClass();
            ....
  }

  HelpingClass getHelpingClass(){
      return new HelpingClass();
  }
}

在你的测试中使用@Spy如下:

public class TestValues {

    @InjectMocks 
    @Spy
    NameClass names;
    @Mock HelpingClass help;
    @Test
    public void testgetValues() throws Exception
    {
        doReturn(help).when(names).getHelpingClass();
        Mockito.when(help.getJSONFile()).thenReturn(json);
        ...
     }
   }