[C++] Whiteboxで内部オブジェクトをmockオブジェクトに置き換える

テストしたいクラス

[cpp]

public class MyClass
{
private InternalClass internalClass;
void SomeMethod()
{
internalClass.InternalMethod();
}
}

[/cpp]

MyClassの内部で作られるクラス

[cpp]

public class InternalClass
{
// MyClass#SomeMethod()の中で呼ばれるMock化したいメソッド
public void InternalMethod()
{
// do something
}
}

[/cpp]

テストコード

[cpp]

public class MyClassUTest
{
@Spy
InternalClass mockInternalClass = new InternalClass();

MyClass MyClass;

@Before
void setUp()
{
myClass = new MyClass();
doNothing().when(internalClass).internalMethod(any());
Whitebox.setInternalState(myClass, "internalClass", mockInternalClass);

}

@Test
public void testMyClass()
{
myClass.SomeMethod();
}
}
[/cpp]

[C++] PowerMockで内部オブジェクトをmock化する

テストしたいクラス

[cpp]

public class SomeClass
{
private InternalClass internalClass;
void SomeMethod()
{
internalClass.InternalMethod();
}
}

[/cpp]

SomeClassの内部で作られるクラス

[cpp]

public class InternalClass
{
// SomeClass#SomeMethod()の中で呼ばれるMock化したいメソッド
public void InternalMethod()
{
// do something
}
}

[/cpp]

テストコード

[cpp]
@RunWith(PowerMockRunner.class)
@PrepareForTest(SomeClass.class)
public class SomeClassUTest
{
@Mock
InternalClass internalClass;

@Before
void setUp()
{
doNothing().when(internalClass).internalMethod(any());
PowerMockito
.whenNew(InternalClass.class)
.withAnyArguments()
.thenReturn(internalClass);
}

@Test
public void testSomeClass()
{
someClass = new SomeClass();
someClass.SomeMethod();
}
}
[/cpp]

[C++/Windows] wstring/UTF16でエンコードされたファイルを読み込む

wstring の場合

[cpp]
#include <codecvt>
#include <iostream>
#include <locale>
#include <fstream>

int main()
{
std::basic_ifstream<wchar_t> ifs("C:\\hoge1.txt", std::ios::binary);
ifs.imbue(std::locale(
ifs.getloc(),
new std::codecvt_utf16<wchar_t, 0x10ffff, std::codecvt_mode( std::little_endian |std::consume_header)>));

std::vector<wchar_t> buf(100);
ifs.read(buf.data(), 100);
std::basic_string<wchar_t> istr(buf.data());
}
[/cpp]

UTF16の場合

[cpp]
#include <codecvt>
#include <iostream>
#include <locale>
#include <fstream>

int main()
{
std::basic_ifstream<uint16_t> ifs("C:\\hoge1.txt", std::ios::binary);
ifs.imbue(std::locale(
ifs.getloc(),
new std::codecvt_utf16<uint16_t, 0x10ffff, std::codecvt_mode( std::little_endian |std::consume_header)>));

std::vector<uint16_t> buf(100);
ifs.read(buf.data(), 100);
std::basic_string<uint16_t> istr(buf.data());
}
[/cpp]

[C++] UTF32からUTF16への変換

[cpp]
#include <codedvt>
#include <locale>

const std::u16string u32ToU16(std::u32string u32Str) {
// codecvt_mode で little endian を指定
std::wstring_convert<std::codecvt_utf16<uint32_t, 0x10ffff, (std::codecvt_mode)1>, uint32_t> converter;
return reinterpret_cast<const char16_t *>(converter.to_bytes(reinterpret_cast<const uint32_t*>(u32Str.c_str())).c_str());
}
[/cpp]

VS2015の不具合(*)によりchar32_tが使えないためuint32_tを指定しているが、LinuxやMacであればchar32_tでよいはず。

(*リンクエラーになる)