0

ユニットテストにグーグルテスト/モックフレームワークを使用しています。SetUp関数でテストしている基本クラスのコンストラクターを呼び出します。SetUpで生成されたオブジェクトを使用してクラスの特定のプライベートメンバーを設定し、テストの動作を変更しました。テスト関数がテストしている基本関数を呼び出すと、プライベートメンバー変数のアドレスが変更されるため、テストのセグメンテーション違反が発生します。私がテストしている別の同様のファイルでは発生しないため、このような動作の原因を特定する必要があります。

//Class to test
//base code

//header file
class To_Test
{

friend My_test_class;

private:
TestStruct* sptr;  //pointer to a structure, set by some random function elsewhere

public:
To_Test();
~To_Test();
boolean Function_1();

}

//cpp file

To_Test::To_Test()
{
sptr = NULL;
}

boolean To_Test::Function_1()
{
boolean variable;
variable = sptr->bool;
if (variable)
            {
            do something
            return TRUE;
            }
return FALSE;
}

//Test framework

//test class header file
#include "To_Test.h"

class My_test_class : public :: testing :: Test
{
public:

To_Test *ToTestObj;
virtual void SetUp();

void Test_Function_1();

}

//gtest.cpp file
My_test_class::SetUp()
{
ToTestObj = New To_test;
}

My_test_class::Test_Function_1()
{
ToTestObject->sptr = (RandomStruct*) malloc (sizeof(RandomStruct));
sptr->bool = TRUE;
ASSERT_TRUE(TRUE = ToTestObject->Function_1());
}

SetUp、Test_Function_1、およびFunction_1のToTestObjectのアドレスは同じです。ただし、SetUpおよびTest_Function_1のsptrのアドレスは、Function_1のアドレスとは異なります。したがって、テストの実行中にFunction_1をステップスルーすると、sptrはNULLを指しているためメモリがなく、sptr->boolでメモリにアクセスしようとすると実行が失敗します。

この問題の原因がわかりません。どんな助けでも本当にありがたいです!

4

1 に答える 1

0

C++ を使用しているようですが、不要なmalloc,を避けNULLTRUEスマート ポインターを使用してメモリ リークを回避してみませんか?

それとは別に、sptrタイプはですが、それにTestStruct*a を割り当てて、メンバーが同じメモリ位置にあるRandomStruct*と予想します。sptr->boolgoogletest に関する質問ではなく、C++ プログラミングに関する質問です。

また、boolは予約済みのキーワードであり、ここに示すように使用しないでください。ただし、 のコードはありませんTestStruct。キーワードnewは、マクロがなければコンパイルできない大きな 'N' で始まるつづりも間違っています。

于 2013-01-22T12:30:26.030 に答える