【问题标题】:Android context not getting mocked when testing测试时Android上下文没有被嘲笑
【发布时间】:2017-10-18 22:25:53
【问题描述】:

我在这种结构中测试SubClass 时遇到问题,我必须将Activity 的上下文传递到FileUsageTool 类中,我在其中写入和读取有关SubClass 和@ 状态的数据987654325@.

public class FragmentA extends Fragment {
    SubClass = new SubClass(getActivity()); //Context from getActivity()
}

public class SubClass extends SuperClass {
   public SubClass(Context ctx) {
      super(ctx);
      line = "hello world";

      //file doesn't exist yet even thought we have created File object in 
      //FileUsageTools constructor
      if (!filer.file.exists()) {

         filer.saveFile(this);
      }
   }
}

public class SuperClass {
    String line;
    public SuperClass(Context ctx) {
       FileUsageTool filer = new FileUsageTool(ctx);
    }
}

FileUsageTool 类中,我必须使用上下文来创建文件并写入文件。 saveToFile 将在 SuperClassSubClass 中被调用。

public class FileUsageTool {
   Context context;
   File file;

   FileUsageTool(Context ctx) {
       context = ctx;
       file = new File(ctx.getFilesDir(), "asd.txt");
   }

   saveFile(SuperClass spr) {
        PrintWriter writer = new PrintWriter(new BufferedWriter(new FileWriter(file)));
        writer.println(spr.line);
        writer.close();
   }
   }

但是当我想测试 SubClass 和模拟 ContextFileUsageTool 类时

@RunWith(MockitoJUnitRunner.class)
public class SubClassTest {

   @Mock
   private Context mockContext;
   @Mock
   private FileUsageTool mockFileUsageTool;
   @InjectMocks
   private SubClass subClass = new SubClass(mockContext);

   public testCase() {
      assertEquals(subClass.line == "hello world");
   }

即使我关闭了mockFileUsageTool,当我运行测试时,我仍然在if (!filer.file.exists()) 收到NullPointerException。问题可能出在模拟或其他方面。

【问题讨论】:

    标签: java android unit-testing junit mockito


    【解决方案1】:

    我相信是因为你在初始化时使用了上下文。

    试试这个

      @RunWith(MockitoJUnitRunner.class)              public class SubClassTest { 
      @Mock private Context mockContext;                  @Mock private FileUsageTool  mockFileUsageTool; 
    

    @InjectMocks 私有子类子类;

      @override
      protected void setUp() {
         subClass = new SubClass(mockContext)
     }
    
      public testCase() { 
        assertEquals(subClass.line == "hello world"); 
    

    }

    【讨论】:

      猜你喜欢
      • 2015-06-06
      • 2016-09-12
      • 1970-01-01
      • 1970-01-01
      • 2019-07-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-07-21
      相关资源
      最近更新 更多