android测试类:ActivityInstrumentationTestCase2<T extends Activity>

ActivityInstrumentationTestCase2<T extends Activity>

第一个类,把过程按照http://www.developer.com/ws/android/development-tools/getting-started-with-junit-on-android.html 的文档过一遍


1 在项目右键,建立Test的Project



2 建立后, 填写名字,选择项目,最后finish。



3 new 一个 Junit Test Case



4 填写内容注意:

父类:android.test.ActivityInstrumentationTestCase2<T>   泛型T为要测试的Activity

                (原文拼写错误了android.test.ActivityInstrumentTestCase2,自己也差点错了)


5 类中的方法注意:

去掉构造中的参数,以及添加含2个参数的构造,  ①带命名空间的类名   ②测试的类的class

public RoomTest() {
super("com.gb.lee.room.EE_DialogRoomActivity",
com.gb.lee.room.EE_DialogRoomActivity.class);
}

必须使用无参的构造,如果使用有参的,会失败【不懂为什么,自动生成的有参试,需要手动修改......】


添加Override的2个方法:setUp();    tearDown();


测试简单的方法,【 通过getActivity()得到测试activity中的方法】

public void testRoom() {
int i = getActivity().add(2, 3);
assertEquals(5, i);
}

最近进行单元测试就可以了

后记: 

这个只能测试Activity,如果要测试与服务器连接后的一些逻辑操作,需要在activity中填写对应逻辑的方法?还要是public的,private通过getActivity()得不到对应的方法。

如果是对外提供的jar包,肯定不能写成private,还需要用反射得到对应的方法,再测试?

【不是很理解,可能其他的类可以解决这个问题!!】


如果要了解更多,去 http://junit.org/   , 上午进不去,只能试着翻墙了






<think>好的,我现在需要分析用户提供的C++代码,并解释其结构和功能。首先,我应该逐步分解代码的各个部分,理解每个模板和概念的作用,然后综合起来看看这个函数测试的声明是如何工作的。 首先,用户提供的代码中有几个部分:类的前向声明、概念的定义,以及一个复杂的模板函数声明。让我一个一个来看。 第一个是`class Block;`,这显然是一个前向声明,说明后面会有一个名为Block的类定义。接下来是模板类`template<class T> class Class1;`,这也是一个前向声明,说明Class1是一个接受单个类型参数的模板类。 然后是概念的声明:`template<class A, class B> concept extends = std::is_base_of_v<B, A>;`。这里定义了一个名为`extends`的概念,用于检查类型A是否是类型B的派生类。`std::is_base_of_v<B, A>`是类型特性,当A派生自B时为true。所以这个概念约束的是A必须继承自B。 接下来是函数的模板声明部分,看起来比较复杂: ```cpp template< template<class> class T1, template<class> class T2, extends<Block> T3, extends<Class1<T3>> T2L = T2<T3>, extends<Class1<T2L>> T1L = T1<T2L> > void 测试(Class1<T1<T2<T3>>> A); ``` 我需要拆解这个模板参数列表: 1. `template<class> class T1`:这是一个模板模板参数,接受一个接受单个类型参数的模板类作为T1。比如,如果有一个模板`template<typename> class Foo`,那么T1可以是Foo。 2. `template<class> class T2`:同理,另一个模板模板参数T2,同样接受单类型参数的模板类。 3. `extends<Block> T3`:这里使用了之前定义的`extends`概念,约束T3必须是Block的派生类。所以T3是一个从Block继承而来的具体类。 4. `extends<Class1<T3>> T2L = T2<T3>`:这里定义了一个模板参数T2L,默认值是T2<T3>。并且T2L必须满足`extends<Class1<T3>>`,也就是T2L必须继承自Class1<T3>。这里需要注意,因为T2是一个模板类,所以T2<T3>生成的具体类型需要是Class1<T3>的派生类。 5. `extends<Class1<T2L>> T1L = T1<T2L>`:类似地,T1L的默认值是T1<T2L>,并且必须继承自Class1<T2L>。同样,T1是模板类,T1<T2L>生成的具体类型需要是Class1<T2L>的派生类。 最后,函数参数是`Class1<T1<T2<T3>>> A`。这里将多个模板组合起来,构造了一个嵌套的模板类型作为Class1的模板参数。即,T3作为最内层的类型,传给T2生成T2<T3>,然后传给T1生成T1<T2<T3>>,最后作为Class1的模板参数,形成Class1<T1<T2<T3>>>类型。 现在,我需要验证各部分的关系是否正确。例如,T3必须是Block的子类,T2<T3>必须是Class1<T3>的子类,T1<T2L>(即T1<T2<T3>>)必须是Class1<T2L>(即Class1<T2<T3>>)的子类。这样,函数参数的类型Class1<T1<T2<T3>>>中的T1<T2<T3>>必须满足继承自Class1<T2<T3>>,而T2<T3>又必须继承自Class1<T3>,T3继承自Block。 可能的目的是确保类型参数的层层嵌套满足特定的继承关系,从而在函数内部可以使用这些类的接口。例如,可能这些模板类T1、T2需要生成特定的层次结构,确保类型安全。 但这里可能存在一个问题:当使用模板模板参数时,是否正确地传递了参数?例如,T2是一个模板类,接受一个类型参数,而T3是一个具体类型,因此T2<T3>应该是一个具体类型。但需要满足T2<T3>继承自Class1<T3>。同样,T1<T2<T3>>需要继承自Class1<T2<T3>>。 假设用户有这样的类结构: - Block的一个子类,比如MyBlock。 - Class1<T>的派生类,比如T2_inst<MyBlock>,其中T2_inst是符合T2的模板,即template<class U> class T2_inst : public Class1<U> {}。 - 同样,T1的实例如T1_inst<T2_inst<MyBlock>> : public Class1<T2_inst<MyBlock>>。 这样,当调用测试函数时,参数类型是Class1<T1_inst<T2_inst<MyBlock>>>,符合所有约束。 总结来说,这个函数测试的声明通过多个模板参数和概念约束,强制要求传入的参数类型必须符合特定的继承结构,确保类型之间的层次关系,可能在设计模式或复杂模板元编程中有应用。</think>我们来逐步分析这段C++代码的结构和功能: $$ \text{代码分解} $$ 1. 类前向声明 ```cpp class Block; // Block类声明 template<class T> class Class1; // 模板类Class1声明 ``` 2. 概念定义 ```cpp template<class A, class B> concept extends = std::is_base_of_v<B, A>; // 检查A是否继承自B ``` 3. 复杂模板函数 ```cpp template< template<class> class T1, // 模板模板参数T1 template<class> class T2, // 模板模板参数T2 extends<Block> T3, // 要求T3继承自Block extends<Class1<T3>> T2L = T2<T3>,// T2<T3>必须继承自Class1<T3> extends<Class1<T2L>> T1L = T1<T2L> // T1<T2L>必须继承自Class1<T2L> > void 测试(Class1<T1<T2<T3>>> A); // 最终参数类型要求 ``` $$ \text{层次约束关系} $$ 设存在类型: ``` T3 -> Block T2<T3> -> Class1<T3> T1<T2<T3>> -> Class1<T2<T3>> ``` $$ \text{参数传递流程} $$ 1. 最内层:`T3`必须继承自`Block` 2. 中间层:`T2<T3>`必须继承自`Class1<T3>` 3. 最外层:`T1<T2<T3>>`必须继承自`Class1<T2<T3>>` $$ \text{代码特点} $$ 1. 使用C++20概念进行类型约束 2. 多层模板参数嵌套 3. 模板模板参数的高级用法 4. 默认模板参数推导机制 $$ \text{使用示例} $$ 假设存在以下继承关系: ```cpp class MyBlock : public Block {}; // 满足T3要求 template<typename U> class MyT2 : public Class1<U> {}; // 满足T2<T3>要求 template<typename U> class MyT1 : public Class1<U> {}; // 满足T1<T2<T3>>要求 ``` 则合法调用形式为: ```cpp 测试<MyT1, MyT2, MyBlock>(Class1<MyT1<MyT2<MyBlock>>>{}); ``` $$ \text{设计目的} $$ 这种结构常用于: 1. 构建复杂类型系统 2. 实现设计模式中的组合模式 3. 确保多层抽象的类型安全 4. 框架开发中的扩展点设计 该代码展示了C++模板元编程的高级技巧,通过多级类型约束构建严格的类型层次体系,适用于需要强类型验证的复杂系统设计。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值