공용 생성자가 없는데 어떻게 Oracle Exception을 모의/가짜/스티븐할 수 있습니까?
테스트에서는 저장 프로시저 오류로 인해 Oracle Exception이 느려졌을 때 발생하는 현상을 테스트해야 합니다.나는 Rhino Mocks를 설치하려고 합니다.
Expect.Call(....).Throw(new OracleException());
그러나 어떤 이유로든 Oracle Exception은 공개 생성자 없이 봉인된 것 같습니다.이것을 테스트하려면 어떻게 해야 합니까?
편집: 바로 다음과 같습니다.
public sealed class OracleException : DbException {
private OracleException(string message, int code) { ...}
}
방법은 다음과 같습니다.
ConstructorInfo ci = typeof(OracleException).GetConstructor(BindingFlags.NonPublic | BindingFlags.Instance, null, new Type[] {typeof(string), typeof(int)}, null);
var c = (OracleException)ci.Invoke(new object[] { "some message", 123 });
도움이 된 모든 것들 덕분에, 당신은 지지를 받았습니다.
오라클의 관리되는 데이터 액세스(v4.121.1.0)를 위해 생성자가 다시 변경되었습니다.
var ci = typeof(OracleException).GetConstructor(BindingFlags.NonPublic | BindingFlags.Instance, null, new Type[] { typeof(int), typeof(string), typeof(string), typeof(string) }, null);
var c = (OracleException)ci.Invoke(new object[] { 1234, "", "", "" });
Oracle은 이후 버전에서 생성자를 변경한 것으로 보이며, 따라서 위의 솔루션은 작동하지 않을 것입니다.
오류 코드만 설정하려는 경우 2.111.7.20에 대해 다음과 같은 작업이 수행됩니다.
ConstructorInfo ci = typeof(OracleException)
.GetConstructor(
BindingFlags.NonPublic | BindingFlags.Instance,
null,
new Type[] { typeof(int) },
null
);
Exception ex = (OracleException)ci.Invoke(new object[] { 3113 });
저는 오라클을 사용하고 있습니다.데이터 액세스.클라이언트 데이터 공급자 클라이언트.Oracle Exception 개체의 새 인스턴스를 구성하는 데 문제가 있지만 공용 생성자가 없다는 메시지가 계속 표시됩니다.위의 모든 아이디어를 시도해 보았는데 null 참조 예외가 계속 발생합니다.
object[] args = { 1, "Test Message" };
ConstructorInfo ci = typeof(OracleException).GetConstructor(BindingFlags.NonPublic
| BindingFlags.Instance, null, System.Type.GetTypeArray(args), null);
var e = (OracleException)ci.Invoke(args);
테스트 코드를 디버깅할 때 항상 'ci'에 대한 NULL 값이 표시됩니다.
Oracle에서 이를 허용하지 않도록 라이브러리를 변경했습니까?NMock에서 사용할 Oracle Exception 개체를 인스턴스화하려면 무엇이 잘못되고 있으며 어떻게 해야 합니까?
그런데, 저는 버전 10g용 클라이언트 라이브러리를 사용하고 있습니다.
감사해요.
찰리.
반사를 사용하여 Oracle Exception 개체를 인스턴스화하시겠습니까?교체하다
new OracleException()
와 함께
object[] args = ... ;
(OracleException)Activator.CreateInstance(typeof(OracleException), args)
반사를 사용하여 Oracle Exception을 인스턴스화합니다.이 블로그 게시물 보기
당신은 항상 이렇게 모든 건설자들을 얻을 수 있습니다.
ConstructorInfo[] all = typeof(OracleException).GetConstructors(
BindingFlags.NonPublic | BindingFlags.Instance);`
위해서Oracle.DataAccess
4.112.3.0 이것은 7개의 생성자를 반환했습니다.
제가 원했던 것은 5개의 주장을 가진 목록에서 두 번째 것이었습니다.int, string, string, string, int
ILSpy에서는 이렇게 보였기 때문에 다섯 번째 주장에 놀랐습니다.
internal OracleException(int errCode, string dataSrc, string procedure, string errMsg)
{
this.m_errors = new OracleErrorCollection();
this.m_errors.Add(new OracleError(errCode, dataSrc, procedure, errMsg));
}
그래서, 내가 원하는 시공자를 얻기 위해, 나는 결국 사용하게 되었습니다.
ConstructorInfo constructorInfo =
typeof(OracleException).GetConstructor(
BindingFlags.NonPublic | BindingFlags.Instance,
null,
new Type[] { typeof(int), typeof(string), typeof(string), typeof(string), typeof(int) },
null);`
좋은 해결책 조지.이는 SqlException에서도 작동합니다.
ConstructorInfo ci = typeof( SqlErrorCollection ).GetConstructor( BindingFlags.NonPublic | BindingFlags.Instance, null, new Type[] { }, null );
SqlErrorCollection errorCollection = (SqlErrorCollection) ci.Invoke(new object[]{});
ci = typeof( SqlException ).GetConstructor( BindingFlags.NonPublic | BindingFlags.Instance, null, new Type[] { typeof( string ), typeof( SqlErrorCollection ) }, null );
return (SqlException) ci.Invoke( new object[] { "some message", errorCollection } );
-재밌는
매번 실패/오류가 발생하는 간단한 저장 프로시저를 작성한 후 이를 사용하여 테스트할 수 있습니까?
언급URL : https://stackoverflow.com/questions/122215/how-can-i-mock-fake-stub-sealed-oracleexception-with-no-public-constructor
'programing' 카테고리의 다른 글
SLURM 작업을 원격으로 연결된 클러스터로 전송하는 데 문제가 있음 (0) | 2023.07.25 |
---|---|
pip을 제거할 수 없음: "distutils 설치된 프로젝트입니다." (0) | 2023.07.25 |
JQuery.load() 콜백 함수 (0) | 2023.07.25 |
확인란과 같은 이미지 사용 (0) | 2023.07.25 |
Moodle에서 동적 링크 버튼을 만드는 방법 (0) | 2023.07.25 |