我有以下代码:
struct A {
protected:
A() {}
A* a;
};
struct B : A {
protected:
B() { b.a = &b; }
A b;
};
Run Code Online (Sandbox Code Playgroud)
奇怪的是它没有编译.罪魁祸首是b.a = &b;
任务:GCC和clang都抱怨A()
受到保护,这不应该是一个问题,因为B继承A.我进入标准的哪个黑暗角落?
我正在使用Mockito 1.9.5.如何模拟受保护方法返回的内容?我有这种受保护的方法......
protected JSONObject myMethod(final String param1, final String param2)
{
…
}
Run Code Online (Sandbox Code Playgroud)
但是,当我尝试在JUnit中执行此操作时:
final MyService mymock = Mockito.mock(MyService.class, Mockito.CALLS_REAL_METHODS);
final String pararm1 = “param1”;
Mockito.doReturn(myData).when(mymock).myMethod(param1, param2);
Run Code Online (Sandbox Code Playgroud)
在最后一行,我得到一个编译错误"方法'myMethod'不可见."我如何使用Mockito来模拟受保护的方法?如果这是答案,我愿意升级我的版本.
我试图使用Java Reflection获取和调用驻留在不同类中的受保护方法以及不同的包.
包含受保护方法的类:
package com.myapp;
public class MyServiceImpl {
protected List<String> retrieveItems(String status) {
// Implementation
}
}
Run Code Online (Sandbox Code Playgroud)
通话课程:
package xxx.myapp.tests;
import com.myapp.MyServiceImpl;
public class MyTestCase {
List<String> items;
public void setUp() throws Exception {
MyServiceImpl service = new MyServiceImpl();
Class clazz = service.getClass();
// Fails at the next line:
Method retrieveItems = clazz.getDeclaredMethod("retrieveItems");
// How to invoke the method and return List<String> items?
// tried this but it fails?
retrieveItems.invoke(clazz, "S");
}
}
Run Code Online (Sandbox Code Playgroud)
编译器抛出此异常:
java.lang.NoSuchMethodException: com.myapp.MyServiceImpl.retrieveItems()
Run Code Online (Sandbox Code Playgroud) 今天我与一位同事讨论了是否要测试是否在课堂上测试私人成员或私人状态.他几乎让我相信为什么它有意义.这个问题的目的不是复制已经存在的关于测试私有成员的性质和原因的StackOverflow问题,例如:将单元测试作为正在测试的类的朋友有什么问题?
在我看来,同事的建议有点脆弱,将朋友声明介绍给单元测试实现课程.在我看来,这是一个禁忌,因为我们将测试代码的一些依赖性引入测试代码,而测试代码已经依赖于测试代码=>循环依赖.即使像重命名测试类这样无辜的事情也会导致破坏单元测试并在测试代码中强制执行代码更改.
我想请C++专家来判断另一个提案,它依赖于我们被允许专门化模板功能的事实.想象一下班级:
// tested_class.h
struct tested_class
{
tested_class(int i) : i_(i) {}
//some function which do complex things with i
// and sometimes return a result
private:
int i_;
};
Run Code Online (Sandbox Code Playgroud)
我不喜欢让i_的吸气剂让它变得可测试.所以我的提议是类中的'test_backdoor'函数模板声明:
// tested_class.h
struct tested_class
{
explicit
tested_class(int i=0) : i_(i) {}
template<class Ctx>
static void test_backdoor(Ctx& ctx);
//some function which do complex things with i
// and sometimes return a result
private:
int i_;
};
Run Code Online (Sandbox Code Playgroud)
通过添加这个函数,我们可以使类的私有成员可测试.注意,不依赖于单元测试类,也不依赖于模板函数实现.在此示例中,单元测试实现使用Boost Test框架.
// tested_class_test.cpp
namespace
{
struct ctor_test_context
{
tested_class& tc_;
int …
Run Code Online (Sandbox Code Playgroud) 如何在C++中对受保护的方法进行单元测试?
在Java中,我要么在与测试类相同的包中创建测试类,要么创建一个匿名子类,在我的测试类中公开我需要的方法,但这些方法在C++中都不可用.
我正在使用NUnit测试一个非托管的C++类.
假设我有一个名为"Base"的类,以及一个名为"Derived"的类,它是Base的子类,并访问受保护的方法和Base的成员.
我现在想要做的就是让它没有其他类可以继承Derived.在Java中,我可以通过声明Derived类"final"来实现这一点.是否有一些C++技巧可以给我同样的效果?
(理想情况下,我希望除了Derived之外没有其他类可以将Base子类化.我不能只将所有代码放入同一个类或使用friend关键字,因为Base和Derived都是模板化的,模板参数比Derived少的基础....)
在他的书中,Herbert Schildt在第172页(第3段)中说" 受保护仅在涉及继承时才适用".
在页228中,表9-1显示可以从同一个包中的非子类访问受保护的成员.
以下代码适用于并支持表9-1中的信息.
Class1.java:
package Mypack;
public class Class1
{
protected pro=1;
public Class1()
{
System.out.println(pro);
}
}
Run Code Online (Sandbox Code Playgroud)
Class2.java
package Mypack;
class Class2 extends Class1
{
Class2()
{
System.out.println(pro);
}
}
Run Code Online (Sandbox Code Playgroud)
Class3.java
package Mypack;
class Class3
{
Class3()
{
Class1 class1=new Class1();
System.out.println(class1.pro);
}
}
Run Code Online (Sandbox Code Playgroud)
可以从派生类Class2访问变量pro.但是如何从非派生类Class3通过对Class1对象的引用来访问它?它与第172页上的陈述相矛盾.如果是这样,那么在这种情况下,我发现公共和受保护的说明符之间没有区别.
我们已经在GitHub上保护了我们的开发分支,以便下游没有人可以直接推送他们的提交.提交需要通过特定功能分支并通过拉取请求进行合并.
有一个场景,一个功能分支合并到开发分支(经过适当的审查和更改)后,我们需要稍后恢复(可能是由于需求的变化).如果我尝试恢复下游的合并提交,它将不允许我推送,因为分支受到保护.我记得GitHub在合并分支时提供了恢复按钮.但不知怎的,我现在无法看到(或找到)按钮.我们需要恢复优先级提交,因此我们暂时从开发分支中删除了保护并推送了恢复提交(最丑陋).
还有其他更好的替代方法可以从受保护的分支恢复提交吗?也许我错过了或误解了一些GitHub功能.
还有一个场景是,如果我在合并之后从GitHub中删除了分支,那我该怎么回复呢?
最近,当我java.lang.IllegalAccessError
尝试从内部类访问由不同类加载器加载的外部父类中声明的受保护字段时,我遇到了运行时错误的问题。简要地:
Parent
有受保护的字段p
。Outer
扩展Parent
。Inner
是在 class 中定义的内部类Outer
。Inner
类里面有一个代码:Outer.this.p
.通常它的编译和运行正常,直到Parent
和Outer
类是由不同的类加载器加载。在这种情况下,我们java.lang.IllegalAccessError
在尝试Outer.this.p
从Inner
. 我发现了一个旧的错误报告(这似乎是一个功能)描述了这种行为:
https://bugs.java.com/bugdatabase/view_bug.do?bug_id=6258289
但分辨率对我来说听起来自相矛盾:
关键是在失败的情况下,内部类不在同一个包中(并且不是 ConcreteCommand/AbstractCommand 的子类)。这只是违反了受保护类的 Java 规范。
听起来是对的。但是,如果我们在不同的包中声明Parent
和Outer
类,但使用单个类加载器加载(只需创建没有任何 jar 加载的示例控制台应用程序),我们就不会收到任何错误。因此,从技术上讲,它违反了受保护类的 Java 规范,但由于我们使用了内部类,因此它可以工作。
因此,对于“不同的包”的两种情况,我们有不同的行为。
有人可以清楚地解释内部类如何访问父类的字段以及为什么它在两种情况下的工作方式不同吗?
对于那些在大型项目和API /框架设计方面具有丰富经验的人来说,这是一个问题.
我正在开发一个将来会被许多其他项目使用的框架,所以我想让它变得更好和可扩展,但同时它需要简单易懂.
我知道很多人抱怨.NET框架包含太多密封类和私有成员.我是否应该避免这种批评并用大量受保护的虚拟成员打开我的所有课程?
让尽可能多的方法和属性保护虚拟是一个好主意吗?在什么情况下你会避免受保护的虚拟和使成员私有.
protected ×10
c++ ×4
java ×3
junit ×2
unit-testing ×2
.net ×1
c# ×1
classloader ×1
final ×1
git ×1
git-revert ×1
github ×1
keyword ×1
members ×1
merge ×1
mocking ×1
mockito ×1
nunit ×1
private ×1
reflection ×1
subclassing ×1
virtual ×1